Присоединение к вложенным ассоциациям (многоуровневый) - PullRequest
0 голосов
/ 18 мая 2018

У меня есть следующие модели и отношения:

Picture of models

У пользователя есть много предложений (где он / она является продавцом), предложение имеетмного покупок, покупка имеет много учетных записей

моделей и ассоциаций:

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  

Я хочу получить все учетные записи любого данного пользователя (в качестве продавца).Эквивалентный оператор 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.

Спасибо за понимание.

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Итак, ваша проблема в том, что пользователь действует как две роли для одних и тех же учетных записей.Вы можете попробовать что-то вроде ниже вещи

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
0 голосов
/ 22 мая 2018

Вы можете joins связать вместе и применить условие where к объединенным связям:

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

Что нужно знать, where использует имя таблицы БД.joinsincludes, eager_load и т. Д.) Использует имя отношения.Вот почему мы имеем:

Admin::Accbook
  .joins(purchase: :offer)
  #                 ^^^^^ relation name
  .where(offers: { seller_id: 123 })
  #      ^^^^^^ table name
0 голосов
/ 18 мая 2018

Попробуйте добавить следующую ассоциацию в users.rb

has_many :accbooks, through: :purchases

...