2015-09-15 44 views
0

我有以下型號/關係父母的集合:的Rails得到孩子

class Directory < ActiveRecord::Base 
    has_one :location 
end 

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

Location使用geocoder寶石。每個目錄條目都有一個位置,以及目錄信息(聯繫人,網站等)。

directory#index中,我想顯示靠近用戶搜索位置的位置。到目前爲止,我有:

def index 
    if params[:search].present? 
    @directories = Location.near(params[:search], 50, :order => :distance).paginate(page: params[:page], :per_page => 10) 
    else 
    @directories = Directory.order(:name).paginate(page: params[:page], :per_page => 10) 
    end 
end 

如何返回對應位置(兒童)目錄(父)項的集合?

回答

0

嗯,不是我的問題的答案,但由於其他答案還沒有到來,所以我小睡了一下,然後意識到這對我來說有點像XY problem

與其生成父母(目錄)集合,我只是做了geocoder gem想要做的事情並生成了一組位置。然後,在我看來,我只是使用directory父協會來到每個相應的目錄。

完美地工作。

0

你可以使用這樣的事情:

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查詢向右移動到INNER JOIN條款:

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 :))。

祝您有美好的一天!

+0

謝謝阿列克謝你的詳細答案,但它不適合我。我懷疑這是因爲我父母和孩子之間有'has_one'關係,所以沒有'locations'關聯。我試着把它定位,但這似乎沒有幫助。我想我會堅持我的方法(並不是那麼糟糕,因爲我父母和孩子之間有一對一的關係),但希望你的回答可以幫助其他人。 –

+0

哦,真遺憾。我不認爲'has_one'是一個問題,也許它是'geocoder'產生一些我不知道的大量查詢。不過,我很高興你已經解決了你的問題:) –