Модель листинга
belongs_to :listable, polymorphic: true
belongs_to :car, -> { where(listings: {listable_type: 'Car'}) }, foreign_key: 'listable_id'
def car
return unless listable_type == "Car"
super
end
listing = Listing.first
listing.car
Ошибка
ActiveRecord::StatementInvalid (PG::UndefinedTable: ОШИБКА: отсутствует запись в предложении FROM для таблицы "списки") LINE 1: ....* FROM "cars" WHERE "cars"."id" = $1 AND "listings". .. ^ : ВЫБЕРИТЕ «автомобили».* ИЗ «автомобилей», ГДЕ «автомобили». «id» = $1 И «списки». «listable_type» = $2 LIMIT $3
Я также пробовал:
belongs_to :car, -> { joins(:listings).where(listings: {listable_type: 'Car'}) }, foreign_key: 'listable_id'
и я получил:
ActiveRecord::ConfigurationError (Не удается присоединить «Автомобиль» к ассоциации с именем «списки»; возможно, вы написали с ошибкой?)
Что вызывает эту ошибку?
super
просто вызовитеlistable
, это вернет вашCar
. Принадлежность_то неверна, потому что предложениеwhere
применяется к моделиCar
(отсюда и ошибка). Чтобы решить эту проблему, вам нужноjoin(:listings)
и бросить туда, где я считаю - person engineersmnky   schedule 26.07.2019-> { joins(:listings).where(listings: {listable_type: 'Car'}) }
, что делает для меня мало смысла, потому что соединение уже должно обеспечивать это для полиморфа, например.INNER JOIN listings ON listings.listable_id = cars.id and listings.listable_type = 'Car'
Так что я до сих пор не уверен, что это нужно. Я никогда не использую полиморфы таким образом, иначе я бы опубликовал ответ. - person engineersmnky   schedule 26.07.2019