has_one究竟做了什么?

And*_*eko 2 postgresql ruby-on-rails ruby-on-rails-4

Rails has_one运行在哪个级别?

例:

class User 
  has_one :comment
end

class Comment
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

我在浏览器中用表单打开两个选项卡以创建注释(user_id取自current_user.id),输入数据,单击每个选项卡中的保存.

现在我有两个有效的评论user_id.

我确信uniqueness: true在Comment模型中添加用户状态验证可以防止使用相同的方式保存多个注释user_id:

validates :user,
  presence: true,
  uniqueness: true
Run Code Online (Sandbox Code Playgroud)

但究竟是什么原因has_one呢?

che*_*iel 5

has_one允许您查询与用户关联的第一条评论user.comment,这将评估与之类似的SQL select * from comments where comments.user_id == USER_ID limit 1.在这种情况下,您可能正在寻找has_many,它会返回多个注释.

但是,并不强制每个用户只存在一条评论.如果您确实只希望每个用户只有一个注释,则应将user_id设置为注释上的唯一列,并在数据库级别强制执行(uniqueness: true不执行此操作).


Bra*_*rth 5

究竟?这个:

  # File activerecord/lib/active_record/associations.rb, line 1405
  def has_one(name, scope = nil, options = {})
    reflection = Builder::HasOne.build(self, name, scope, options)
    Reflection.add_reflection self, name, reflection
  end
Run Code Online (Sandbox Code Playgroud)

资料来源:

https://github.com/rails/docrails/blob/master/activerecord/lib/active_record/associations.rb#L1405

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

  • 对于"恰好这个"有一个+1.一个人应该小心他们的问题的措辞:) (2认同)
  • 值得一提的是,"唯一性:真"将不会在数据库级别强制执行,因此它容易受到"竞争条件"的影响. (2认同)
  • @SvenKoschnicke我不同意这是无益的.这是开玩笑的一半,但另一半是死的严重.这就是Rails如何变得更好(并提出更具体的问题).我知道所有最好的Rails开发人员都会在这样的问题出现时直接进入Rails代码.我提供了此类研究的切入点以及有关唯一性验证的其他信息. (2认同)