50

Railsモデルでゲッター/セッターのペアをテストしたところ、いつも奇妙で一貫性がないと思っていた動作の良い例を見つけました。

この例では、を扱っていclass Folder < ActiveRecord::Baseます。

Folder belongs_to :parent, :class_name => 'Folder'

getterメソッドで、次を使用する場合:

def parent_name
  parent.name
end

...また...

def parent_name
  self.parent.name
end

...結果はまったく同じです。親フォルダーの名前を取得します。ただし、getterメソッドで使用する場合は...

def parent_name=(name)
  parent = self.class.find_by_name(name)
end

...親はnilになりますが、使用すると...

def parent_name=(name)
  self.parent = self.class.find_by_name(name)
end

...その後、それは機能します。

だから、私の質問は、なぜあなたは時々self.methodを宣言する必要があるのですか、そしてなぜあなたはただローカル変数を使うことができるのですか?

ActiveRecordでの使用/使用にself一貫性がないようですが、これをもっとよく理解したいので、自分を宣言する必要があるかどうかを常に推測しているような気がしません。ActiveRecordモデルでselfを使用すべき/使用すべきでないのはいつですか?

4

1 に答える 1

88

これは、属性/関連付けが実際にはメソッド(ゲッター/セッター)であり、ローカル変数ではないためです。「親=値」と述べると、Rubyは値をローカル変数の親に割り当てたいと想定します。

スタックのどこかにセッターメソッド"defparent ="があり、それを呼び出すには "self.parent ="を使用して、ローカル変数を設定するだけでなく、実際にセッターを呼び出したいことをrubyに通知する必要があります。

ゲッターに関しては、Rubyは最初にローカル変数があるかどうかを確認し、それが見つからない場合は同じ名前のメソッドを見つけようとします。そのため、ゲッターメソッドは「自己」なしで機能します。

言い換えれば、それはRailsのせいではありませんが、Rubyが本質的にどのように機能するかです。

お役に立てば幸いです。

于 2011-03-03T16:59:29.220 に答える