Объем модели Rails на основе связанной модели

У меня есть две соответствующие модели здесь: InventoryItem а также Store,

class InventoryItem < ActiveRecord::Base
  belongs_to    :store
  include Tire::Model::Search
  include Tire::Model::Callbacks

  def self.search(params)
    tire.search(load: true, :per_page => 40) do
      query { string params[:query], default_operator: "AND" } if params[:query].present?
    end
  end
end


class Store < ActiveRecord::Base
  geocoded_by :address
  after_validation :geocode, :if => lambda{ |obj| obj.address_changed? }

  has_many  :inventory_items
end

Я хочу выполнить поиск инвентаризации в магазинах, которые находятся рядом с текущим пользователем (пользователь также геокодируется с использованием geocoder gem). Подход, который я рассматриваю, заключается в том, чтобы как-то охватить модель, но я не уверен, как ее реализовать. Вот как я обычно нахожу близлежащие магазины в своих контроллерах:

@stores = Store.near([current_user.latitude, current_user.longitude], current_user.distance_preference, :order => :distance)

Есть ли способ сделать :local область действия моей модели InventoryItem как-то основана на том, находится ли связанный с ней магазин рядом с текущим пользователем? В качестве альтернативы, есть ли способ достичь моей цели с помощью эластичного поиска? Заранее спасибо!

1 ответ

Решение

Есть несколько способов сделать это. Я думаю, что самый простой способ начать будет что-то вроде этого:

class Store < ActiveRecord::Base
   scope :for_user, -> {|user| near([user.latitude, user.longitude], user.distance_preference, :order => :distance)}
end

Что позволит вам позвонить

Store.for_user(whatever_user)

В Инвентаризации я бы также попытался найти по магазинам:

class InventoryItem < ActiveRecord::Base
  scope :for_stores, -> {|stores| where(store_id: stores.map(&:id))}
end

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

InventoryItem.for_stores(Store.for_user(whatever_user)).search(...)
Другие вопросы по тегам