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_usernil 。 一旦你修复它并将它与上面的查询结合起来,你应该是好的。