activerecord rails查找没有组的页面

时间:2010-09-09 07:53:11

标签: ruby-on-rails

我有以下情况: 页面有很多组。

现在,我正在尝试找到没有使用activerecord组的第一页。 我尝试过这样的事情:

Page.find(:first, :joins => :groups, :select => 'DISTINCT `pages`.*')

但到目前为止没有运气。

3 个答案:

答案 0 :(得分:2)

一种解决方案可能是为组添加counter_cache。

在Group.rb

belongs_to :page, :counter_cache => true

然后,您需要创建迁移

def self.up
  add_column :pages, :groups_count, :integer, :default => 0

  Page.reset_column_information
  Page.find(:all).each do |p|
    Page.update_counters p.id, :groups_count => p.groups.length
  end
end

def self.down
  remove_column :pages, :groups_count
end

所以,现在你可以做到:

Page.first(:conditions => { :groups_count => 0 })

答案 1 :(得分:2)

这比ActiveRecord更像SQL问题。您需要的是加入2个表,但选择那些未在连接表中引用的表。

Page.first(:include => :groups, :conditions => ["`#{Group.table_name}`.id IS NULL"]
# The opposite query would be
Page.first(:include => :groups, :conditions => ["`#{Group.table_name}`.id IS NOT NULL"]
# Note that this slightly different than just: 
Page.first(:include => :groups)
# This produces a IN query, rather than join.

同样:joins不起作用,因为它会创建INNER JOIN,而不是OUTER JOIN,在这种情况下是必需的。{/ p>

答案 2 :(得分:0)

类似的东西:

Page.find(:all, 
          :select => "pages.*, count(groups.page_id) group_count", 
          :joins => :groups, 
          :group => "pages.id having group_count = 0)