Задать вопрос
@zggb

Active Record, scope и вложенность третьего уровня?

Здравствуйте!
Имеется модель User. В ней
has_many :estates, dependent: :destroy
Модель Estate. В ней полиморфная связь
has_one :location, as: :locatable, dependent: :destroy

Хочу сделать фильтр User по location

Простые вложения фильтровал scope, по типу
scope :type, -> (type) { User.includes(:estates).where("estates.re_type" => type) }


Не могу понять, как добраться через User к Location.
Заранее благодарю!

UPD Миграция Location
class CreateLocations < ActiveRecord::Migration
  def change
    create_table :locations do |t|
      t.string :address
      t.decimal :lat, {:precision=>10, :scale=>6}
      t.decimal :lng, {:precision=>10, :scale=>6}
      t.references :locatable, polymorphic: true, index: true

      t.timestamps null: false
    end
    add_index  :locations, [:lat, :lng]
  end
end


UPD
Пробовал
1)
User.where(estates: { location: { name: "there" } })

Ошибка
SQLite3::SQLException: no such column: real_estates.locatable_id: SELECT "users".* FROM "users" WHERE "real_estates"."locatable_id" = '---
:address: !ruby/object:Arel::Nodes::BindParam {}'


2)
User.joins(estates: :location).where(location: {address: "London"})

Ошибка
SQLite3::SQLException: no such column: location.address: SELECT "users".* FROM "users" INNER JOIN "estates" ON "estates"."user_id" = "users"."id" INNER JOIN "locations" ON "locations"."locatable_id" = "estates"."id" AND "locations"."locatable_type" = ? WHERE "location"."address" = 'London'
  • Вопрос задан
  • 2278 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@zggb Автор вопроса
User.joins(estates: :location).where(locations: {address: "London"})
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
viktorvsk
@viktorvsk
Для начала попробуйте хэш запись,вроде
User.where(estates: { location: { name: "there" } })
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы