has_one究竟做了什么?

时间:2015-08-18 07:09:30

标签: ruby-on-rails postgresql ruby-on-rails-4

Rails'在哪个级别? has_one运作?

示例:

class User 
  has_one :comment
end

class Comment
  belongs_to :user
end

我在浏览器中使用表单打开两个标签以创建评论(user_id取自current_user.id),输入数据,点击每个标签中的保存。

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

我确信在评论模型中向用户状态验证添加uniqueness: true可以防止使用相同的user_id保存多个评论:

validates :user,
  presence: true,
  uniqueness: true

has_one负责什么呢?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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