【问题标题】:Correctness of using methods in model that joins other models in Rails在模型中使用方法连接 Rails 中其他模型的正确性
【发布时间】:2012-07-28 16:11:16
【问题描述】:

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

假设我有以下类方法,这些方法有助于通过链接查询名为 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).

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

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

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我没有尝试过,但我会通过 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
    

    而你正在做的事情通常由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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      相关资源
      最近更新 更多