ActiveRecordモデルのゲッターメソッドを上書きしようとしています。nameモデルCategoryでと呼ばれる属性があり、次のようなことができるようにしたいと思います。
def name
name_trans || name
end
name_trans属性がnilでない場合はそれを返し、そうでない場合は属性を返しnameます。どうすればいいですか?
これは通常、次のように呼び出されます。
@category.name
ActiveRecordモデルのゲッターメソッドを上書きしようとしています。nameモデルCategoryでと呼ばれる属性があり、次のようなことができるようにしたいと思います。
def name
name_trans || name
end
name_trans属性がnilでない場合はそれを返し、そうでない場合は属性を返しnameます。どうすればいいですか?
これは通常、次のように呼び出されます。
@category.name
回答:
Railsのスタイルガイドを使用することをお勧めしますself[:attr]以上read_attribute(:attr)。
次のように使用できます。
def name
name_trans || self[:name]
end
更新:Railsスタイルガイドによる推奨される方法はself[:name]、read_attributeおよびの代わりに使用することですwrite_attribute。私の答えをスキップして、代わりにこれを選ぶことをお勧めします。
read_attribute名前属性の値を実際にフェッチし、nameメソッドへの再帰的な呼び出しを回避するために使用する必要があることを除いて、それはまったく同じように行うことができます。
def name
name_trans || read_attribute(:name)
end
self[:name]何read_attribute[:name]ですか?
getterメソッドを上書きするための別のオプションを追加したいと思います。それは単に:superです。
def name
name_trans || super
end
これは、属性の取得メソッドだけでなく、関連付けの取得メソッドでも機能します。
ゲッターのオーバーライドと使用read_attributeは関連付けには機能しませんが、alias_method_chain代わりに使用できます。
def name_with_override
name_trans || name_without_override
end
alias_method_chain :name, :override
nameが呼び出されますname_with_override。何らかの理由で元のメソッドを呼び出したい場合は、を呼び出すことができますname_without_override。
Railsのread_attributeメソッドを使用できます。 Railsのドキュメント