2014-09-22 4 views
1

У меня есть две подходящие модели здесь: InventoryItem и Store.Модель модели Rails на основе соответствующей модели

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 

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

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

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

ответ

0

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

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(...) 
+0

Спасибо, протестированы обе области, которые вы предложили, и они работают. Также тестировали их в совокупности, как последняя строка вашего ответа. К сожалению, мои поисковые запросы не охвачены областью, но это еще одна проблема, связанная с библиотекой поиска. – settheline

Смежные вопросы