2012-06-05 10 views
0

Я пытаюсь извлечь из своей базы данных все сообщения и перечислить их в порядке DESC относительно их даты создания. Пока мне удалось проверить все записи, относящиеся к одной категории, но я хочу отображать все сообщения независимо от того, к какой категории они принадлежат. Я знаю, что мне нужно перебирать каждую категорию и получать сообщения от каждого, но я не знаю, как это сделать. Вот мой код:Loop in Loop in Rails Controller

EDIT:

def index 
    @institution = Institution.find(current_user.institution.id) 
    @categories = Category.all 
    @categories.each do |category| 
     @posts = Post.where("category_id = ? and institution_id = ?", category, @institution).order("created_at DESC") 
    end 
    authorize! :read, @post 
    respond_with(@posts) 
    end 

Может кто-то пожалуйста, мне точку в правильном направлении?

EDIT 2: Мое мнение (index.html.haml)

%h1 Listing posts 

%table 
    %tr 
    %th Title 
    %th Description 
    %th User 
    %th Category 
    %th Type 
    %th Class 
    %th Institution 

    - @posts.each do |post| 
    %tr 
     %td= post.title 
     %td= post.description 
     %td= post.user_id 
     %td= post.category_id 
     %td= post.institution_id 
+0

Почему вы не просто запрашиваете все сообщения через 'Post.all' или хотите только сообщения, у которых есть категория category? – cpjolicoeur

+0

Если я не ошибаюсь, вы просто хотите сгруппировать свои сообщения по категориям, см. [Rails Guides] (http://guides.rubyonrails.org/active_record_querying.html#group) – topek

+0

Я забыл упомянуть, что хочу получить сообщения которые имеют набор category_id! Сожалею. –

ответ

3

Вы перезапись @posts с каждой итерации. Попробуйте это:

def index 
    @institution = Institution.find(current_user.institution.id) 
    @categories = Category.all 
    @posts = [] 
    @categories.each do |category| 
     tposts = Post.where("category_id = ? and institution_id = ?", category, @institution).order("created_at DESC") 
     @posts += tposts if tposts 
    end 
    authorize! :read, @post 
    respond_with(@posts) 
end 

Чтобы получить все сообщения с не нулевой CATEGORY_ID, попробуйте следующее:

def index 
    @institution = Institution.find(current_user.institution.id) 
    @categories = Category.all 
    @posts = Post.where("category_id is not null and institution_id = ?", @institution).order("created_at DESC") 
    authorize! :read, @post 
    respond_with(@posts) 
end 

Изменение is not null к > 0 для целого CATEGORY_ID или != '' если таблица содержит «» вместо нулей.

Удачи.

+0

Кажется, не работает в моем случае. Я просто хочу, чтобы цикл каждой категории и использовать мой поиск, как я его протестировал, и он работает. –

+0

@ DanieGarzon Я отредактировал в соответствии с вашим измененным кодом. – Anil

+0

Спасибо за ваш быстрый ответ Анил! Вы правы, я проверил мою консоль, и я перезаписал @posts, но я последовал за вашим советом, а «<<» дает мне ошибку: «undefined method' << »для nil: NilClass». Вы уверены, что это действительные скобки? –