0

也许标题令人困惑,但我不知道如何解释我的怀疑。

假设我有以下类方法,它们将有助于进行链接以查询名为 Player 的模型。玩家属于用户,但如果我想从特定村庄或城市获取玩家,我必须获取用户模型。

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

这将两次加入用户,我认为这是不正确的..对吗?

所以我的问题是:这样做的正确方法是什么?

4

1 回答 1

0

我没有尝试过,但我会通过 ActiveRecord 生成的实际 sql 查询来判断您的问题的答案。如果它只有一个连接,我会像你一样使用它,如果这导致两个连接,你可以创建一个方法 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

并且您所做的通常是使用参数化范围处理的:

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
于 2012-07-28T17:01:37.013 回答