Ruby on rails Geocoder Gem:如何在两种不同的模型之间使用?

Ruby on rails Geocoder Gem:如何在两种不同的模型之间使用?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,pagination,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Pagination,我使用和gems根据与用户位置和孩子妈妈地址的距离对结果进行排序。我的模型是这样的: 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 ha

我使用和gems根据与用户位置和孩子妈妈地址的距离对结果进行排序。我的模型是这样的:

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.address

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'
.......
ActiveModel::MissingAttributeError

missing attribute: birthday
有什么建议吗


更新

到目前为止,我已经做到了:

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
上面的代码获取当前用户的工作地址(使用Desive),但现在我得到了错误:

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'
.......
ActiveModel::MissingAttributeError

missing attribute: birthday
对于我所有的孩子,在页面上的属性

<% @kids.each do |kid| %>
   <%= kid.birthday %>
   <%= kid.name %>
   <% if kid.upkeep.present? %>
     <%= kid.upkeep %>
     <%= kid.upkeep_size %> 
   <% end %>      
   <%= kid.age %>
   <%= kid.favorite_color %>
<% end %>


我认为这是因为它认为妈妈和孩子有相同的属性。有什么想法吗?

问题是
孩子本身没有地理编码,所以你不能使用
范围附近的

像这样的事情应该会让你接近:

@dad.kids.joins(:mom).merge(Mom.near("San Francisco, CA, US")).paginate(...).order(...)

编辑


根据您更新的问题,当前用户的
似乎是
nil
。一旦你解决了这个问题并将其与上面的查询结合起来,你就应该很好了。

问题是
孩子本身并没有地理编码,所以你不能使用
附近的
范围

像这样的事情应该会让你接近:

@dad.kids.joins(:mom).merge(Mom.near("San Francisco, CA, US")).paginate(...).order(...)

编辑


根据您更新的问题,当前用户的
似乎是
nil
。一旦你解决了这个问题并将其与上面的查询结合起来,你就应该很好了。

问题是
孩子本身并没有地理编码,所以你不能使用
附近的
范围

像这样的事情应该会让你接近:

@dad.kids.joins(:mom).merge(Mom.near("San Francisco, CA, US")).paginate(...).order(...)

编辑


根据您更新的问题,当前用户的
似乎是
nil
。一旦你解决了这个问题并将其与上面的查询结合起来,你就应该很好了。

问题是
孩子本身并没有地理编码,所以你不能使用
附近的
范围

像这样的事情应该会让你接近:

@dad.kids.joins(:mom).merge(Mom.near("San Francisco, CA, US")).paginate(...).order(...)

编辑


根据您更新的问题,当前用户的
似乎是
nil
。一旦你解决了这个问题并将其与上面的查询结合起来,你就应该很好了。

这就是使用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

:选择
选项是我需要添加的。

这是使用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

:选择
选项是我需要添加的。

这是使用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

:选择
选项是我需要添加的。

这是使用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

:选择
选项是我需要添加的。

非常感谢。事实上,我需要改变我的问题,因为它问错了。我试着从用户的位置开始,然后按距离排序。现在看看我的问题。如何使用当前用户地址并从那里开始显示结果?好的,现在我知道我得到了什么。我想将用户的地址与
@kids
循环中的
kid.mom.address
进行比较。非常感谢。事实上,我需要改变我的问题,因为它问错了。我试着从用户的位置开始,然后按距离排序。现在看看我的问题。如何使用当前用户地址并从那里开始显示结果?好的,现在我知道我得到了什么。我想将用户的地址与
@kids
循环中的
kid.mom.address
进行比较。非常感谢。事实上,我需要改变我的问题,因为它问错了。我试着从用户的位置开始,然后按距离排序。现在看看我的问题。如何使用当前用户地址并从那里开始显示结果?好的,现在我知道我得到了什么。我想将用户的地址与
@kids
循环中的
kid.mom.address
进行比较。非常感谢。事实上,我需要改变我的问题,因为它问错了。我试着从用户的位置开始,然后按距离排序。现在看看我的问题。如何使用当前用户地址并从那里开始显示结果?好的,现在我知道我得到了什么。我想将用户的地址与
@kids
循环中的
kid.mom.address
进行比较。