0

Pictureクラスがあり、ロジックに応じて「description」データベース列の値を返すことをオーバーライドしたいと思います。

これはRailsで有効ですか?データベースの列の値を返す前に、常にクラスに依存してクラスメソッドを呼び出すことはできますか?

# database columns for Picture class
# description => String
# parent_id => Integer

class Picture < ActiveRecord::Base

  def description
    if parent_id.nil?
      self.description      
    else
      description = Picture.find(parent_id).description
    end
  end

end 

Railsのソースコードのどこに答えがあるのか​​わからなかったので、助けていただければ幸いです。

ありがとう!

編集

子または親の画像であるかどうかに応じて、画像の説明を返そうとしています(ネストすることができます)。例は少し工夫されています...データベース列と同じ名前のメソッドを使用することでこれを簡単に回避できます...など

def my_description
   if parent_id.nil? # return db data since no parent
      self.description
   else # return parent's description if one exists
      description = Picture.find(parent_id).description
   end
end

私はここで不必要に複雑にしようとしていると思います

4

2 に答える 2

2

何をしようとしているのかは完全には明確ではありませんが、superを使用して、メソッド内から説明値を取得できます。

def description
  if parent_id.nil?
    super
  else
    self.description = Picture.find(parent_id).description
  end
end

self.description =説明値を設定することを想定しているため、使用する最後の行を変更したことに注意してください。そうでない場合は、変数に割り当てる必要はありません。

于 2012-07-27T04:53:02.463 に答える
1

descriptionメソッドでread_attribute(:description)を使用する必要があります(オーバーライドしても問題ありません)。

さらに、Picture.find rigmaroleの代わりに、elseセクションでparent.descriptionを実行できます。あなたが持っていると確信している親の関連付けを使用してください。

def description
  # if parent_id is there and the parent object can be found and that parent has a description
  if (parent_id? && parent && parent.description?)
    # show parental description
    parent.description
  else
    # read my own database attribute
    read_attribute(:description)
  end
end

上記の説明に割り当てると、ローカル変数になるため、何かが行われるかどうかはわかりません。そして、リーダーでself.description =を実行するのは、少し厄介な私見です。

于 2012-07-27T05:49:04.533 に答える