我的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 中
in products_controller.rb 上述索引方法生成 错误 我不知道如何继续。显然,我使用near方法的方式存在问题:选择但我无法绕过它。如何退回按距离排序的产品? 我使用MySQL作为数据库适配器;我听说过SQLite缺少trig函数的问题。...
<%= 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 %>
def index
@products = Store.near(params[:custom_address], 100, order: :distance, :select => "products.*")
end
ActiveRecord::StatementInvalid in Products#index
答案 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