具有一对多关系的Geocoder Ruby on Rails

时间:2013-11-10 10:06:09

标签: ruby-on-rails activerecord rails-geocoder

我的Rails应用程序中有两个模型,它们构成了one_to_many关系。第一个模型store表示实体店,并且具有纬度和经度列,使用“地理编码器”宝石和地址列正确地进行地理编码。这家商店有很多产品。该产品has_one store。我想根据用户在搜索表单中输入的地址的接近程度返回产品索引。以下是我的代码的相关部分以及我尝试实现搜索:

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

in product.rb

class Offer < ActiveRecord::Base
  belongs_to :store
end
在views / products / 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 %>

in products_controller.rb

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

上述索引方法生成

ActiveRecord::StatementInvalid in Products#index

错误

我不知道如何继续。显然,我使用near方法的方式存在问题:选择但我无法绕过它。如何退回按距离排序的产品?

我使用MySQL作为数据库适配器;我听说过SQLite缺少trig函数的问题。

1 个答案:

答案 0 :(得分:0)

我使用以下代码正确运行了代码:

我在产品型号中添加了一个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