Rails 3加入问题

时间:2011-03-19 04:24:41

标签: ruby-on-rails

嘿那里,   我有一个用户模型,一个discovered_locations模型和一个boss_locations模型。

boss_location是boss位置的静态表示。发现的位置是(user_id,boss_location_id)。

有什么好方法(如果涉及范围,我猜更好),获得用户老板位置和发现位置的连接?

也就是说,我希望加入老板的位置。我想要所有的老板位置,无论是发现与否,但我也想知道它们是否被发现。

你会怎么做?

1 个答案:

答案 0 :(得分:2)

一种简单有效的方法是将counter_cache添加到boss_location / discovered_location关系中。这样你就可以在没有连接的情况下进行查询并获得相同的结果:

class BossLocation < ActiveRecord::Base
  has_many :discovered_locations

  scope :discovered, where(["#{quoted_table_name}.discovered_locations_count > ?", 0])
  scope :undiscovered, where(["#{quoted_table_name}.discovered_locations_count = ?", 0])

  def discovered?
    self.discovered_locations_count > 0
  end
end

class DiscoveredLocation < ActiveRecord::Base
  belongs_to :user
  belongs_to :boss_location, :counter_cache => true
end

如果你想坚持加入路线,你必须做这样的事情:

class BossLocation < ActiveRecord::Base
  has_many :discovered_locations

  scope :with_discovery_status, joins("LEFT OUTER JOIN discovered_locations ON boss_locations.id = discovered_locations.boss_location_id").group("boss_locations.id").select("boss_locations.*, count(discovered_locations.id) AS discover_status")

  def discovered?
    self[:discover_status].present? && self['discover_status'].to_i > 0 || self.discovered_locations.size > 0
  end
end

LOJ将保留所有记录,但select中的count()将为您提供所需的状态标志。希望这就是你要找的东西。