Rails ActiveRecord 关联“has_many,每个都有 has_one”

Posted

技术标签:

【中文标题】Rails ActiveRecord 关联“has_many,每个都有 has_one”【英文标题】:Rails ActiveRecord association "has_many, each of which has_one" 【发布时间】:2015-01-24 16:05:21 【问题描述】:

我有一个关于 ActiveRecord 关联的问题,我试图有一个 User 模型,其中每个用户可以有许多 Products(然后属于该特定用户)。但是,在产品展示之前,它需要一个有效的权限,所以我想在上述构造中添加第三个模型,Permission

我制定了以下句子以使思考过程更容易: 一个User has_many Products,每一个has_one Permission

ActiveRecord 关联现在看起来像这样:

class User < ActiveRecord::Base
  has_many :products
  has_many :permissions
end

class Product < ActiveRecord::Base
  belongs_to :user
  has_one :permission
end

class Permission < ActiveRecord::Base
  belongs_to :product
  belongs_to :user
end

我的问题:

    这是正确的方法吗(真的有效吗?) 如果我从不需要在我的应用中列出用户的所有权限,是否有必要声明 User has_many 权限和 Permission belongs_to 用户?

想请大家确认一下我的想法是对还是错,或者有没有更好的方法来解决我的问题,希望这个问题对其他人也有用,谢谢!

【问题讨论】:

【参考方案1】:

我会同时回答这两个问题。该代码将工作(给定正确的迁移),但不是你想要的。从 User 类中删除 has_many :permissions 并从 Permission 类中删除 belongs_to :user

【讨论】:

【参考方案2】:
    没关系。 应该是has_many :permissions, through: :products,如果你希望它能够从用户那里得到permissions,但在permissions表中不包含user_id列。

db 查询生成如下:

SELECT "permissions".* 
FROM "permissions" INNER JOIN "products" ON "permissions"."product_id" = "products"."id" 
WHERE "products"."user_id" = [user_id]

【讨论】:

以上是关于Rails ActiveRecord 关联“has_many,每个都有 has_one”的主要内容,如果未能解决你的问题,请参考以下文章

带有 has_many belongs_to 关联的 Rails activerecord 查询

Rails范围过滤元素没有has_many关联元素

如何将记录添加到has_many:通过rails中的关联

为此使用啥 Rails-ActiveRecord 关联?

Rails 4找不到关联has_many,通过:关系错误

Rails Activerecord 通过三个关联查询?