Создайте область видимости Rails, сравнивая поля в двух таблицах

У меня есть несколько связанных таблиц в приложении

class Listing < ActiveRecord::Base
  belongs_to :house
  belongs_to :multiple_listing_service
end

class House < ActiveRecord::Base
  has_one :zip_code
  has_one :primary_mls, through: :zip_code
end

Я хотел создать область, которая производит все Листинги, которые связаны с Первичным MLS для связанного Дома. Другими словами, область действия должна создавать все листинги, в которых для связанного дома указан множественный_лист_сервис_идентификатор = primary_mls.id.

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

Есть идеи?

1 ответ

Если я правильно понимаю, я не уверен, что чистая сфера будет подходить. Предполагая, что у вас есть:

class MultipleListingService < ActiveRecord::Base
  has_many :listings
  has_many :zip_codes
end

Я хотел бы пойти на что-то вроде:

class House < ActiveRecord::Base
  ...

  def associated_listings
    primary_mls.listings
  end
end

Обновление 1

Если ваша цель состоит в том, чтобы просто получить первичный список, то я бы добавил is_primary поле к Listing, Это было бы наиболее эффективным. Альтернативой является соединение из трех таблиц, которое может работать, но его трудно оптимизировать:

class Listing < ActiveRecord::Base
  ...
  scope :primary, -> { joins(:houses => [:zip_codes])
                      .where('zip_codes.multiple_listing_service_id = listings.multiple_listing_service_id') }
Другие вопросы по тегам