Ruby on rails 4 Rails从孩子那里收集父母的信息

Ruby on rails 4 Rails从孩子那里收集父母的信息,ruby-on-rails-4,Ruby On Rails 4,我有以下模型/关系: class Directory < ActiveRecord::Base has_one :location end class Location < ActiveRecord::Base belongs_to :directory geocoded_by :full_address end 如何返回与位置(子项)相对应的目录(父项)项集合?嗯,严格来说,这不是我问题的答案,但由于没有其他答案,我打了个盹,然后意识到这对我来说有点麻烦 我没有生成

我有以下模型/关系:

class Directory < ActiveRecord::Base
  has_one :location
end

class Location < ActiveRecord::Base
  belongs_to :directory
  geocoded_by :full_address
end

如何返回与位置(子项)相对应的目录(父项)项集合?

嗯,严格来说,这不是我问题的答案,但由于没有其他答案,我打了个盹,然后意识到这对我来说有点麻烦

我没有生成父目录集合,而是按照geocoder gem的要求生成了一个位置集合。然后,在我看来,我只是使用
目录
父关联来访问每个对应的目录


非常好用。

您可以使用以下内容:

Directory.joins(:locations).where(locations: { id: Location.near(params[:search], 50, :order => :distance) })
这将生成类似以下内容的查询:

SELECT `directories`.* 
FROM `directories` 
INNER JOIN `locations` ON `locations`.`directory_id` = `directories`.`id` 
WHERE `locations`.`id` IN (SELECT `locations`.`id` FROM `locations` WHERE "your search query here" )
编辑:或者您可以将
位置
查询右移到
内部联接
子句中:

location_query = Location.near(params[:search], 50, :order => :distance).distinct.select(:directory_id)
directories = Directory.joins("INNER JOIN (#{location_query.to_sql}) loc ON loc.directory_id = directories.id")
我相信上面的查询比直接映射目录更好,即

directories = Location.near(params[:search], 50, :order => :distance).
  paginate(page: params[:page], :per_page => 10).map(&:directory)
因为在我的查询中,您可以在正确的级别(目录)应用分页,但在这里您可以将其应用于位置。这不是很好,因为如果某些位置属于同一个目录,则最终会出现重复的目录(如果您忘记在查询末尾添加
.uniq
),或者出现较短的目录列表(如果您没有忘记
.uniq
:)


祝你今天愉快

谢谢阿列克西的详细回答,但对我来说不起作用。我怀疑这是因为我在父母和孩子之间有一个
关系,所以没有
位置
关联。我试着把它设置成
位置
,但似乎没有用。我想我会坚持我的方法(不是很糟糕,因为我的父母和孩子之间有一对一的关系),但希望你的回答能帮助其他人。哦,真遗憾。我不认为
has_one
是个问题,也许是
geocoder
生成了一些我不知道的沉重查询。不过,我很高兴你解决了你的问题:)
directories = Location.near(params[:search], 50, :order => :distance).
  paginate(page: params[:page], :per_page => 10).map(&:directory)