加入嵌套关联(多级)

Edu*_*rez 6 activerecord ruby-on-rails ruby-on-rails-5

我有以下模型和关系:

\n\n

模特图片

\n\n

一个用户有多个报价(他/她是卖家),一个报价有多个购买,一个购买有多个 Accbook

\n\n

模型和协会:

\n\n
class User < ApplicationRecord\n  has_many :offers, foreign_key: :seller_id\n  has_many :purchases, foreign_key: :buyer_id\nend\n\nclass Offer < ApplicationRecord\n  has_many :purchases\n  belongs_to :seller, class_name: \'User\'\nend\n\nclass Purchase < ApplicationRecord\n  belongs_to :offer\n  belongs_to :buyer, class_name: \'User\'\n  has_one :seller, through: :offer\n  has_many :accbooks,  class_name: \'Admin::Accbook\', foreign_key: \'purchase_id\' \nend\n\nmodule Admin\n  class Accbook < ApplicationRecord\n    belongs_to :purchase\n  end\nend  \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
SELECT  "accbooks".* \nFROM "accbooks" \nINNER JOIN "purchases" ON "purchases"."id" = "accbooks"."purchase_id"\nINNER JOIN "offers" ON "offers"."id" = "purchases"."offer_id"\nINNER JOIN "users" ON "users"."id" = "offers"."seller_id"\nWHERE "users"."id" = ?\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
Admin::Accbook.joins( {purchase: :offer} )\n
Run Code Online (Sandbox Code Playgroud)\n\n

这给了我这个 SQL 结果:

\n\n
SELECT  "accbooks".*\nFROM "accbooks"\nINNER JOIN "purchases" ON "purchases"."id" = "accbooks"."purchase_id"\nINNER JOIN "offers" ON "offers"."id" = "purchases"."offer_id"\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

感谢您的任何见解。

\n

MrY*_*iji 7

您可以将joins关系放在一起并where在连接关系上应用条款:

Admin::Accbook
  .joins(purchase: :offer)
  .where(offers: { seller_id: 123 })
Run Code Online (Sandbox Code Playgroud)

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

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