Geocoder Gem:如何在两种不同型号之间使用?
我正在使用Geocoder和Will Paginategem根据用户所在位置和孩子妈妈的地址之间的距离来对结果进行排序。 我的模型是这样的:
class User has_many :kids geocoded_by :address end class Kid belongs_to :mom belongs_to :dad end class Mom has_many :kids has_many :dads, through: :kids geocoded_by :address end class Dad has_many :kids has_many :moms, through: :kids end
现在,我正在尝试使用正确的范围,我将使用Users.address
并将其与Kids.moms.addresses
进行比较
def show @dad = Dad.find(params[:id]) @user_location = current_user.address @kids = @dad.kids.near(@user_location, 100).paginate(page: params[:page], per_page: 25).order(created_at: :desc) end
这给了我错误:
NoMethodError - undefined method `address' for nil:NilClass: app/controllers/dads_controller.rb:14:in `show' actionpack (4.0.2) lib/action_controller/metal/implicit_render.rb:4:in `send_action' actionpack (4.0.2) lib/abstract_controller/base.rb:189:in `process_action' actionpack (4.0.2) lib/action_controller/metal/rendering.rb:10:in `process_action' .......
有什么建议?
UPDATE
到目前为止我已经完成了这个:
class ApplicationController before_filter :set_user_location private def set_user_location if signed_in? @user_location = current_user.address end end end class DadsController def show @dad = Dad.find(params[:id]) @kids = @dad.kids.joins(:mom).merge(Mom.near(@user_location, 100)).order(name: :asc, created_at: :desc).paginate(page: params[:page], per_page: 25) end
上面的代码使当前用户地址工作(使用Devise),但现在我收到错误:
ActiveModel::MissingAttributeError missing attribute: birthday
对于我在页面上的所有孩子属性。
我想这是因为它认为妈妈和孩子有同样的属性。 有任何想法吗?
这是你可以用Geocoder做到的:
def show @dad = Dad.find(params[:id]) near = Mom.near(@user_location, 100, :select => "kids.*") @kids = @dad.kids.joins(:mom).merge(near).order(name: :asc, created_at: :desc).page(params[:page]) end
:select
选项是我需要添加的选项。
问题是Kid
没有自己进行地理编码,所以你不能使用near
范围。
这样的事情应该让你接近:
@dad.kids.joins(:mom).merge(Mom.near("San Francisco, CA, US")).paginate(...).order(...)
文件
编辑
根据您更新的问题,看起来current_user
是nil
。 一旦你修复它并将它与上面的查询结合起来,你应该是好的。