2012-07-28 44 views
0

也許標題很混亂,但我不知道如何解釋我的疑問。在模型中使用連接Rails中其他模型的方法的正確性

說我有以下類方法,這將有助於做鏈接來查詢稱爲播放器的模型。玩家屬於用戶,但如果我想從特定的村莊或城市獲取玩家,我必須獲取用戶模型。

def self.by_village(village) 
    joins(:user).where(:village => "village") 
end 

def self.by_city(city) 
    joins(:user).where(:city => "city") 
end 

比方說,我想獲取由村也受到城市的球員,所以我會做...

Player.by_city(city).by_village(village). 

這會做一個連接用戶的兩倍,而且我不不認爲這是正確的..對嗎?

所以我的問題是:這樣做的正確方法是什麼?

回答

0

我還沒有嘗試過,但我會判斷您的問題的答案由實際的SQL查詢ActiveRecord生成。如果它只有一個連接,我會像你一樣使用它,如果這導致兩個連接,你可以創建一個方法by_village_and_city。

好的。現在試了一下:

1.9.2p290 :022 > Player.by_city("Berlin").by_village("Kreuzberg") 
    Player Load (0.3ms) SELECT "players".* FROM "players" INNER JOIN "users" ON "users"."id" = "players"."user_id" WHERE "users"."city" = 'Berlin' AND "users"."village" = 'Kreuzberg' 
=> [#<Player id: 1, user_id: 1, created_at: "2012-07-28 17:05:35", updated_at: "2012-07-28 17:05:35">, #<Player id: 2, user_id: 2, created_at: "2012-07-28 17:08:14", updated_at: "2012-07-28 17:08:14">] 

所以,ActiveRecors結合了兩個查詢,做正確的事,我會使用它,除非: 我不得不改變雖然你實現:

class Player < ActiveRecord::Base 
    belongs_to :user 
    def self.by_village(village) 
    joins(:user).where('users.village' => village) 
    end 

    def self.by_city(city) 
    joins(:user).where('users.city' => city) 
    end 
end 

和你'重做通常是用parameterized scopes

class Player < ActiveRecord::Base 
    belongs_to :user 

    scope :by_village, lambda { |village| joins(:user).where('users.village = ?', village) } 
    scope :by_city, lambda { |city| joins(:user).where('users.city = ?', city) } 

end 
相關問題