ruby-on-rails - 基于关联模型的Rails模型范围

标签 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

我想从当前用户附近的商店中搜索stockstock_items(用户也使用geocoder gem进行了地理编码)。我正在考虑的方法是以某种方式确定模型的范围,但是我不确定如何实现。通常,这是我在 Controller 中找到附近商店的方式:
@stores = Store.near([current_user.latitude, current_user.longitude], current_user.distance_preference, :order => :distance)

有没有一种方法可以根据其关联商店是否在当前用户附近来在我的InventoryItem模型上执行:local范围?另外,有没有办法通过Elasticsearch实现我的目标?提前致谢!

最佳答案

有几种方法可以完成此操作。我认为最简单的开始方法是这样的:

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

我不熟悉您的搜索引擎,但如果它进行 Activity 记录范围嵌套,则应该可以执行以下操作:
InventoryItem.for_stores(Store.for_user(whatever_user)).search(...)

关于ruby-on-rails - 基于关联模型的Rails模型范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25982372/

相关文章:

ruby-on-rails - Rails 和嵌入式 ruby

ruby-on-rails - 参数数量错误(1 为 2)Rails 4. 可能是 strong_params 问题

ruby-on-rails - 使用 Devise 将可确认模块添加到现有站点

ruby-on-rails - 有没有办法在 Rails 中保存 Paypal 的 payKey

elasticsearch - 修改Kibana仪表板上显示的关键字

ruby - 真正的轮胎方法的代理?

ruby-on-rails - ElasticSearch 和轮胎/Rails : use two fields for a single facet

elasticsearch - 多列主要/分组依据?

Elasticsearch:按请求中传递的数组过滤文档包含所有文档数组元素

ruby-on-rails - 在ElasticSearch和Tire中使用缺少过滤器的构面