【问题标题】:Joining Nested Associations (Multiple Level)加入嵌套关联(多级)
【发布时间】:2018-05-17 23:13:35
【问题描述】:

我有以下模型和关系:

一个用户有很多优惠(他/她是卖家),一个优惠有很多购买,一个购买有很多 Accbooks

模型和关联:

class User < ApplicationRecord
  has_many :offers, foreign_key: :seller_id
  has_many :purchases, foreign_key: :buyer_id
end

class Offer < ApplicationRecord
  has_many :purchases
  belongs_to :seller, class_name: 'User'
end

class Purchase < ApplicationRecord
  belongs_to :offer
  belongs_to :buyer, class_name: 'User'
  has_one :seller, through: :offer
  has_many :accbooks,  class_name: 'Admin::Accbook', foreign_key: 'purchase_id' 
end

module Admin
  class Accbook < ApplicationRecord
    belongs_to :purchase
  end
end  

我想获取任何给定用户(作为卖家)的所有 Accbook。等效的 SQL 语句如下所示:

SELECT  "accbooks".* 
FROM "accbooks" 
INNER JOIN "purchases" ON "purchases"."id" = "accbooks"."purchase_id"
INNER JOIN "offers" ON "offers"."id" = "purchases"."offer_id"
INNER JOIN "users" ON "users"."id" = "offers"."seller_id"
WHERE "users"."id" = ?

到目前为止,我已经尝试过:

Admin::Accbook.joins( {purchase: :offer} )

这给了我这个 SQL 结果:

SELECT  "accbooks".*
FROM "accbooks"
INNER JOIN "purchases" ON "purchases"."id" = "accbooks"."purchase_id"
INNER JOIN "offers" ON "offers"."id" = "purchases"."offer_id"

现在我不知道如何将联接添加到 User 模型,然后如何添加 Where 条件。

感谢您的任何见解。

【问题讨论】:

  • 你可以做Admin::Accbook.joins(purchase: { offer: :seller } ).where(users: { id: 123 })
  • @MrYoshiji:您的答案在 Where 中略有变化时效果很好,即:Admin::Accbook.joins(purchase: { offer: :seller }).where(offers: { Seller_id: 123 })。如果您将此作为答案发布,我会将其标记为正确答案。谢谢!

标签: ruby-on-rails activerecord ruby-on-rails-5 queryinterface


【解决方案1】:

您可以将joins 关联在一起,并将where 子句应用于连接的关系:

Admin::Accbook
  .joins(purchase: :offer)
  .where(offers: { seller_id: 123 })

要知道,where 使用数据库表的名称。 joins(和 includeseager_load 等)使用关系名称。这就是为什么我们有:

Admin::Accbook
  .joins(purchase: :offer)
  #                 ^^^^^ relation name
  .where(offers: { seller_id: 123 })
  #      ^^^^^^ table name

【讨论】:

    【解决方案2】:

    尝试在users.rb中添加以下关联

    has_many :accbooks, through: :purchases

    【讨论】:

    • 您的回答很有帮助,非常感谢。但是,它为我提供了用户是买方(通过购买)的所有 Accbooks,我正在寻找她是卖方的 Accbooks。
    【解决方案3】:

    所以您的问题是用户为同一帐户充当 2 个角色。你可以试试下面的东西

    class User < ApplicationRecord
      has_many :offers, foreign_key: :seller_id
      has_many :purchases, foreign_key: :buyer_id
      has_many :offers_purchases,
               through: :offers,
               :class_name => 'Purchase',
               :foreign_key => 'offer_id',
               :source => :purchases
    end
    

    【讨论】:

    • 谢谢,但这并没有考虑到与 Accbooks 表的关系。我需要的 Accbooks 是 Purchase 的子项,而 Purchase 是 Offer 的子项,其中给定的用户是卖方。
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多