ActiveRecord помощь в запросах - PullRequest
0 голосов
/ 12 июля 2010

Мне нужна небольшая помощь с запросом AR.Вот как выглядят мои модели:

class User < AR:B
  has_many :publications
end

class Publication < AR:B
  belongs_to :user
  belongs_to :category
end

class Category < AR:B
  has_many :publications
end

Теперь предположим, что я хочу перебрать все существующие категории и либо отобразить публикации пользователя, либо отобразить что-то вроде "# {current_user.name} не имеет публикаций в этой категории ".

class PublicationsController < AC:B

  def index
    @categories = Category.find(:all, :include => :publications, :conditions => { 'publications.user_id' => current_user })
  end

end

Это дает мне все категории, в которых у пользователя есть публикации, но не имеет" пустых ".

Есть предложения?: -)

Ответы [ 2 ]

0 голосов
/ 13 июля 2010

Вы можете просто изменить вызов поиска:

@categories = Category.find(:all, :include => :publications, :conditions => [ 'publications.user_id=? OR publications.user_id IS NULL', current_user ])

Обратите внимание, что здесь мы используем вариант Array, а не Hash, поскольку пример в документации подразумевает, что это правильное использование.

0 голосов
/ 12 июля 2010

Это дает вам все объекты категории:

@categories = Category.all

Затем, если вы объявите has_many: через ассоциации вы можете сделать что-то вроде следующего:

@categories.each do |category|
  if category.users.include?(current_user)
    # User has publications
    publications = category.publications.select { |pub| pub.user == current_user }
  else
    # User has no publications
  end
end

(has-manyсквозные объявления:

class User < AR:B
  has_many :publications
  has_many :categories, :through => :publication
end

class Publication < AR:B
  belongs_to :user
  belongs_to :category
end

class Category < AR:B
  has_many :publications
  has_many :users, :through => :publication
end

... предупреждение: сухой код)

Хотя, вероятно, есть более удобный способ сделать это с использованием именованных областей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...