Edu*_*rez 6 activerecord ruby-on-rails ruby-on-rails-5
我有以下模型和关系:
\n\n\n\n一个用户有多个报价(他/她是卖家),一个报价有多个购买,一个购买有多个 Accbook
\n\n模型和协会:
\n\nclass 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 \nRun Code Online (Sandbox Code Playgroud)\n\n我想获取任何给定用户(作为卖家)的所有 Accbook。等效的 SQL 语句如下所示:
\n\nSELECT "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" = ?\nRun Code Online (Sandbox Code Playgroud)\n\n到目前为止我已经尝试过这个:
\n\nAdmin::Accbook.joins( {purchase: :offer} )\nRun Code Online (Sandbox Code Playgroud)\n\n这给了我这个 SQL 结果:
\n\nSELECT "accbooks".*\nFROM "accbooks"\nINNER JOIN "purchases" ON "purchases"."id" = "accbooks"."purchase_id"\nINNER JOIN "offers" ON "offers"."id" = "purchases"."offer_id"\nRun Code Online (Sandbox Code Playgroud)\n\n现在我不知道如何将联接添加到用户模型,然后如何添加Where 条件。
\n\n感谢您的任何见解。
\n您可以将joins关系放在一起并where在连接关系上应用条款:
Admin::Accbook
.joins(purchase: :offer)
.where(offers: { seller_id: 123 })
Run Code Online (Sandbox Code Playgroud)
需要知道的是,where使用数据库表的名称。joins(和includes、eager_load等)使用关系名称。这就是为什么我们有:
Admin::Accbook
.joins(purchase: :offer)
# ^^^^^ relation name
.where(offers: { seller_id: 123 })
# ^^^^^^ table name
Run Code Online (Sandbox Code Playgroud)