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呢?
has_one允许您查询与用户关联的第一条评论user.comment,这将评估与之类似的SQL select * from comments where comments.user_id == USER_ID limit 1.在这种情况下,您可能正在寻找has_many,它会返回多个注释.
但是,并不强制每个用户只存在一条评论.如果您确实只希望每个用户只有一个注释,则应将user_id设置为注释上的唯一列,并在数据库级别强制执行(uniqueness: true不执行此操作).
究竟?这个:
# 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