1

これはおそらく非常にばかげた質問ですが、どうぞ

class Foo < ActiveRecord::Base
 attr_accessor :group_id
end

アーブから

# gets record which has group_id set to 106    
foo = Foo.find(1)
foo.group_id
=> nil

私が行って削除すると

attr_accessor :group_id

すべてが正常に機能します

foo = Foo.find(1)
foo.group_id
=> 106

私の質問はなぜですか?attr_accessor は、プロパティ :group_id のアクセサー/ミューテーターを作成しないでください。そのため、すべてが機能するはずです。私は何が欠けていますか?

アップデート

ここでの私の動機の説明は、特定のプロパティの一括割り当てを使用したいということです(Rails 3.2.x以降、これが必要です)。そのためには attr_accessible が必要です。もちろん、責任を持って使用すれば、コードはそのようにはるかにクリーンであることがわかります:)

4

4 に答える 4

4

group_idは既にオブジェクトのプロパティのように見えFooます (省略された場合に 106 を返すという事実によって示されますattr_accessor)。を追加attr_accessorすることで、既存のものをオーバーライドし、 というメソッド リーダーとライターを作成しgroup_idます。group_id何も定義していないため、新しく定義されたの戻り値は nil です。

概念的には、次のような結果になります。

class Foo < ActiveRecord::Base
  def group_id  # overriding previous definition of 'group_id'
    nil
  end
end


編集:

あなたの目標がプロパティを公開することである場合は、はい、使用してくださいattr_accessible

于 2012-07-17T11:13:24.980 に答える
4

これは、ActiveRecord がデータベース テーブルの属性を実際のモデルの属性に自動的にマップするために発生します。追加attr_accessorすると、新しく定義された独自の属性でデータベース属性を覆い隠します。

基本的に、Railsattr_accessorは、対応するデータベース テーブル内のすべての属性を自動的に定義 (または類似のもの) します。

複数の割り当てで特定の属性のみにアクセスできるようにする方法を探している場合は、代わりに を参照してくださいattr_accessible

于 2012-07-17T11:15:29.723 に答える
0

テーブルに group_id という名前の列がある場合、ActiveRecord がアクセサーを定義します。このように上書きすると、呼び出しは単に group_id という名前の通常のインスタンス変数を検索し、nil を返します。

于 2012-07-17T11:20:31.330 に答える
0

アクセサーがなければ、確実に'belongs_to :group' Foo モデルに があるため、'group_id' を 'Foo' のインスタンスに呼び出すと、このフィールドの値が取得されます。

たとえば、その属性( group_id )のように呼び出されるアクセサーを設定すると、元のフィールドが上書きされ、値が割り当てられていない場合は nil が返されます。

class Foo < ActiveRecord::Base
  attr_accessor :group_id
end

# gets record which has group_id set to 106    
foo = Foo.find(1)
foo.group_id
=> nil
foo.group_id = "wadus"
=> "wadus"
foo.group_id
=> "wadus"
于 2012-07-17T11:17:31.333 に答える