2015-08-18 42 views
2

Rails的has_one在哪个级别上运行?has_one究竟做了什么?

实施例:

class User 
    has_one :comment 
end 

class Comment 
    belongs_to :user 
end 

我打开与形式创建注释浏览器两个选项卡(user_idcurrent_user.id剖切),输入数据,点击保存在每个标签。

现在我有两个有效的意见user_id

我相信,在Comment模型中添加uniqueness: true用户存在审定会做预防保存多个注释以相同user_id的工作:

validates :user, 
    presence: true, 
    uniqueness: true 

但是,什么是has_one负责呢?

+1

现在,如果你做'user.comment'你会得到一个评论回来,而不是两个。这就是它的作用。 –

+0

是的,没有太多的.. –

回答

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 

来源:

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

+0

对不起,我无法拒绝,或使它适合评论... –

+2

有一个“正是这个”+1。一个人应该小心他们的问题的措辞:) –

+2

值得一提的是'独特性:true'不会在db级别执行,所以它容易受到“竞争条件”的影响。 –

5

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

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