Rails基于关联模型建模范围

时间:2014-09-22 20:09:18

标签: ruby-on-rails elasticsearch tire

我在这里有两个相关模型:InventoryItemStore

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(用户也使用地理编码器gem进行地理编码)。我考虑的方法是以某种方式确定模型的范围,但我不确定如何实现。以下是我在控制器中找到附近商店的方法:

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

有没有办法在我的InventoryItem模型上根据其关联商店是否在当前用户附近以某种方式执行:local范围?或者,有没有办法用elasticsearch实现我的目标?提前谢谢!

1 个答案:

答案 0 :(得分: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(...)