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
负责什么呢?
答案 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