2010-07-12 3 views
0

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

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 

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

Любые предложения? :-)

ответ

0

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

@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 

(имеет многим -Через декларации:

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 

... предупреждение: drycode)

Возможно, существует более аккуратный способ сделать это, используя названные области.

+0

Спасибо за ответ, но как я могу получить доступ к публикациям? @ category.publications все равно дадут мне все публикации категории ... – malloy

+0

Внутри if-заявления есть публикации = ..., которые должны дать вам публикации, которые пользователь имеет в категории –

+0

Err .... думал, что это ' d - код контроллера:/Проблема решена, спасибо! – malloy

0

Вы могли бы просто изменить вызов найти:

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

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

+0

Это дает мне все категории с публикациями, но не во всех категориях. Условие publications.user_id IS NULL будет ложным по умолчанию, потому что нет соответствующих записей, или я что-то не хватает? – malloy

+0

Мне нужно попробовать или прочитать код, чтобы понять SQL, который выходит, в среднем может работать следующее: @categories = Category.find (: all,: joins => "LEFT JOIN публикации ON publications.user_id = # {current_user.id} ") –