0

我的 Rails 应用程序中有两个模型,它们形成 one_to_many 关系。第一个模型 store 代表实体商店,并具有使用 'geocoder' gem 和地址列正确地理编码的纬度和经度列。商店有_many 产品。产品 has_one 商店。我想根据用户在搜索表单中输入的地址的接近程度返回产品索引。以下是我的代码的相关部分以及我实现搜索的尝试:

在 schema.rb 中:

create_table "products", force: true do |t|
  t.string   "title"
  ...
  t.integer  "store_id"
end

create_table "stores", force: true do |t|
  ...
  t.string   "business_address"
  t.float    "latitude"
  t.float    "longitude"
end

在 store.rb

class Store < ActiveRecord::Base
  has_many :products
  geocoded_by :business_address
  after_validation :geocode, :if => :business_address_changed?
end

在产品.rb

class Offer < ActiveRecord::Base
  belongs_to :store
end

在意见/产品/search.html.erb

...
<%= form_tag products_path, :method => 'get' do %>
  <p>
    Find products near<br />
    <%= text_field_tag :custom_address, params[:custom_address] %><br />
  </p>
  <p>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>

在 products_controller.rb 中

def index
  @products = Store.near(params[:custom_address], 100, order: :distance, :select => "products.*")
end

上述索引方法生成一个

ActiveRecord::StatementInvalid in Products#index

错误

我不确定如何继续。显然,我使用 near 方法和 :select 的方式存在问题,但我无法理解它。我如何退回按距离排序的产品?

我使用 MySQL 作为数据库适配器;由于 SQLite 缺少三角函数,我听说过一些问题。

4

1 回答 1

0

我使用以下代码使我的代码正常工作:

我在 Product 模型中添加了一个 attr_accessor:

class Product < ActiveRecord::Base

  belongs_to :store
  attr_accessor :distance_to_user

end

我改变了索引方法:

def index
  @products = []
  if params[:custom_address]
    geocoded_stores = (Stores.near(params[:custom_address], 100,))
    geocoded_stores.each do |s|
      s.products.each do |product|
        product.distance_to_user = s.distance
        @products << product
      end
    end
  else
    @products = Product.all
  end
end
于 2013-11-13T18:28:44.100 回答