рельсы activerecord находят страницы без групп - PullRequest
0 голосов
/ 09 сентября 2010

У меня следующая ситуация: Страницы имеет много групп.

Теперь я пытаюсь найти первую страницу, у которой нет группы с activerecord. Я пробовал такие вещи:

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

но пока, конечно, не повезло.

Ответы [ 3 ]

2 голосов
/ 09 сентября 2010

Это скорее проблема SQL, чем ActiveRecord. Вам нужно объединить 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, который требуется в этом случае.

2 голосов
/ 09 сентября 2010

Одним из решений может быть добавление 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 })
0 голосов
/ 09 сентября 2010

Что-то вроде:

Page.find(:all, 
          :select => "pages.*, count(groups.page_id) group_count", 
          :joins => :groups, 
          :group => "pages.id having group_count = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...