attr_accessor,无法访问属性

这可能是一个非常愚蠢的问题但是我们走了

class Foo < ActiveRecord::Base attr_accessor :group_id end 

来自irb

 # 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创建属性的accessor / mutator:group_id以及为什么所有应该工作。 我错过了什么?

更新

下面的答案很好,就像我在这里的动机解释一样,我想使用某些属性的质量分配(从Rails 3.2.x起你需要这个)。 为此你需要attr_accessible,我发现代码更清洁,当然如果负责任地使用:)

看起来group_id已经是你的Foo对象的一个​​属性(由于当省略attr_accessor时它返回106这一事实表明)。 通过添加attr_accessor您将覆盖已存在的内容并创建名为group_id的方法读取器和group_id 。 由于您没有定义任何内容,因此新定义的group_id的返回值为nil。

从概念上讲,你最终会遇到这样的事情:

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

编辑:

如果您的目标是公开属性然后是,请使用attr_accessible

发生这种情况是因为ActiveRecord会自动将数据库表中的属性映射到实际模型中的属性。 添加attr_accessor时,您可以使用自己的新定义属性覆盖数据库属性。

基本上,rails会自动为相应数据库表中的所有属性定义attr_accessor (或类似的东西)。

如果您正在寻找一些方法来解决如何使多个赋值只能访问某些属性,那么您应该查看attr_accessible

如果没有访问器,肯定你的Foo模型中有'belongs_to :group' ,所以如果你将’group_id’称为’Foo’实例,你将获得该字段的值。

例如,如果你设置一个名为like that attribute(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" 

如果表中有一个名为group_id的列,则ActiveRecord会为您定义访问者。 当你像你一样覆盖它时,你的调用只是搜索一个名为group_id的常规实例变量,它返回nil。