Ruby on rails 为什么';t:readonly=>;真正的工作属于协会吗?

Ruby on rails 为什么';t:readonly=>;真正的工作属于协会吗?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有以下型号: class Question < ActiveRecord::Base belongs_to :user, :readonly => true end 为什么这是真的?我希望:readonly=>true可以防止在初始创建后更改此属性?如果没有,那么:readonly选项实际上做了什么 编辑 使用attr\u readonly将提供我所寻找的不可更改性(不变性?) class Question < ActiveRecord::Base belon

我有以下型号:

class Question < ActiveRecord::Base

  belongs_to :user, :readonly => true

end
为什么这是真的?我希望:readonly=>true可以防止在初始创建后更改此属性?如果没有,那么:readonly选项实际上做了什么

编辑

使用
attr\u readonly
将提供我所寻找的不可更改性(不变性?)

class Question < ActiveRecord::Base

  belongs_to :user
  attr_readonly :user_id

end
类问题
唯一的问题是,当您尝试更改属性时,它不会引发异常,因此很容易从静默失败中获取bug。

从文档中

:readonly
    If true, the associated object is readonly through the association.
所以我想这会阻止你做一些事情,比如

question.user.name = 'Hacked'

但是让您继续修改关系本身。

就像@christianblais所说的,它只影响更改对象的属性,而不是替换它

防止在模型中重新定义user=

class Question < ActiveRecord::Base

  belongs_to :user, :readonly => true

  def user=(new_user)
    if self.user.nil?
      write_attirbute :user_id , new_user.id
    else 
      return false # or raise your prefrence 
    end
end
类问题true
def user=(新用户)
如果self.user.nil?
write_attirbute:user_id,new_user.id
其他的
返回false#或提高优先级
结束
结束
或者您可以消除条件并使其始终引发异常,然后使用new或create对其进行初始化,/update attributes

只要属于某个id列,就引用该id列def user=(new\u user)将不会触发,但def user\u id=(new\u user\u id)即可!例如:

类问题true
def user_id=(新用户_id)
如果self.user.nil?
写入属性:用户id、新用户id
其他的
返回false#或提高您的偏好
结束
结束
结束

在Rails4和ruby 1.9.3上进行测试

我已经尝试过重新定义用户=。我还使用了attr_readonly,它可以完成任务,但不是很干净,因为当您实际尝试更新属性时,它不会抛出错误。这看起来不错,但它破坏了我的一个测试:。我现在使用的是Ruby 2.1和Rails 4.0.2,“属于…”,attr\u readonly=>true”打破了模型。需要继续找,但谢谢。打得好,我查过了,你很到位。
class Question < ActiveRecord::Base

  belongs_to :user, :readonly => true

  def user=(new_user)
    if self.user.nil?
      write_attirbute :user_id , new_user.id
    else 
      return false # or raise your prefrence 
    end
end