web-dev-qa-db-ja.com

Ruby / Rails / activerecord)で常に自己が必要なわけではないのはなぜですか?

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モデルで自分自身を使用すべき/すべきでないのはいつですか?

47
Andrew

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

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

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

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

お役に立てば幸いです。

82
pinkmexican