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)