我有以下情况: 页面有很多组。
现在,我正在尝试找到没有使用activerecord组的第一页。 我尝试过这样的事情:
Page.find(:first, :joins => :groups, :select => 'DISTINCT `pages`.*')
但到目前为止没有运气。
答案 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)