2011-05-06 17 views
10

私は自分のデータベーステーブルのモデルを持っています。私はその特定のテーブルの列名をオーバーライドしたい。どうすればそれを達成できますか?Railsモデルの列を上書きする方法は?

は、例えば、私のテーブルには、DUMMYと呼ばれ、それは私が@dummy.col_aをやっているだろうcol_a

col_a 
20 
34 
42 
23 
12 

と呼ばれる一つの列を持ってみましょう。今度は、このメソッドは0で終わる数値に対して私は0を返し、それ以外の場合は元の値を返すべきです。私は新しいメソッドを定義することでそれを行うことができましたが、カラム名自体をオーバーライドしたいと思います。助けてください。

答えて

22

col_aメソッドを無効にすることができます。 read_attributeメソッドを使用して、データベースの値を読み取ります。このようなもの:

def col_a 
    if self.read_attribute(:col_a).to_s.end_with?('0') 
    0 
    else 
    self.read_attribute(:col_a) 
    end 
end 
9

単純に、列と同じ名前のメソッドを定義できます。実際の列の値を取得するには、self [column_name]を使用します。したがって、このような作業をする必要があります:

class Dummy < ActiveModel::Base 
    def col_a 
    self[:col_a] % 10 == 0 ? 0 : self[:col_a] 
    end 
end 

(これはcol_aは整数を前提としています。)

+0

使用することです[:col_a]%10 = 0を!? self [:col_a]:0'または '(self [:col_a]%10).zero? ? 0:self [:col_a] ' – fl00r

+0

Yup - ここでは0と評価されると仮定しましたが、そうではありません。一定。 – Thilo

4

文書で説明するようにoverwriting default accessorsでそれを達成することができます。すべての列の値は、アクティブレコードオブジェクトの基本アクセサを使用して自動的に使用できますが、この動作を特殊化することがあります。これは、デフォルトのアクセサ(属性と同じ名前を使用)を上書きし、実際に変更するにはread_attribute(attr_name)write_attribute(attr_name, value)を呼び出すことで行うことができます。

にスクロールすると、デフォルトアクセサーを上書きしますセクションを参照してください。

0

私はここで少し遅れて相手にだけど、それを行うには、本当にエレガントな方法は、単に `自己である必要がありsuper

​​
関連する問題