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のドキュメント