Проблема с простыми вложенными ассоциациями Rails, где предложение для родителя - PullRequest
0 голосов
/ 09 сентября 2018

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

class Business < ApplicationRecord
  has_many :shopping_trips
end

class ShoppingTrip < ApplicationRecord
  belongs_to :business
  has_many :purchases
end

class Purchase < ApplicationRecord
  belongs_to :shopping_trip
end

Таким образом, у Бизнеса может быть много покупок, и у каждой из этих покупок может быть много покупок.

Я пытаюсь запуститьпростой запрос в таблице покупок, чтобы найти покупки, которые принадлежат конкретному бизнесу.Поэтому я пишу это:

purchases = Purchase.joins(:shopping_trip => :business ).where(:shopping_trip => {:business_id => 1})

К сожалению, это не работает.Я получаю следующую ошибку:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "shopping_trip"
LINE 1: ...sses"."id" = "shopping_trips"."business_id" WHERE "shopping_...
                                                             ^
: SELECT "purchases".* FROM "purchases" INNER JOIN "shopping_trips" ON "shopping_trips"."id" = "purchases"."shopping_trip_id" INNER JOIN "businesses" ON "businesses"."id" = "shopping_trips"."business_id" WHERE "shopping_trip"."business_id" = $1

Объединение выглядит примерно так, но, похоже, условие where не выполняется.

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Проверить это ...

all_purchase = Buy.all

all_purchase.each do | each_purchase | each_purchase.shopping_trip.business конец

0 голосов
/ 09 сентября 2018

Лучшее решение состоит в том, чтобы настроить косвенные ассоциации, чтобы вы могли выполнять запросы через модель объединения без ручного объединения:

class Business < ApplicationRecord
  has_many :shopping_trips
  has_many :purchases, through: :shopping_trips
end

class ShoppingTrip < ApplicationRecord
  belongs_to :business
  has_many :purchases
end

class Purchase < ApplicationRecord
  belongs_to :shopping_trip
  has_one :business, through: :shopping_trip
end

Теперь вы можете запросить с любой стороны:

@business = Business.eager_load(:purchases).find(1)
@purchases = @business.purchases

# or
@purchases = Purchase.eager_load(:buisness).where(businesses: { id: 1 })
0 голосов
/ 09 сентября 2018

ActiveRecord :: StatementInvalid: PG :: UndefinedTable: ОШИБКА: отсутствует Запись FROM-предложения для таблицы "shopping_trip"

Вам необходимо указать имя таблицы , а не имя ассоциации внутри where. Так что shopping_trip должно быть shopping_trips

purchases = Purchase.joins(:shopping_trip => :business ).where(:shopping_trips => {:business_id => 1})
...