Как применить области для объединения через коллекцию? - PullRequest
1 голос
/ 20 июля 2011

У меня есть модель Category, которая has_many :posts. На моей индексной странице я перебираю категории и выводю что-то вроде этого:

@categories.each do |category|
  link_to category.title, category

  category.posts.published.limit(4).each do |post|
    link_to post.title, post
  end

end

Это работает, но published.limit(4) там не принадлежит, и я бы хотел перенести его на контроллер. Как мне это сделать?

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Я бы создал область на Посте, которая инкапсулировала бы и опубликованную и ограничение:

class Post < ActiveRecord::Base

  scope :highlights, published.limit(4)

end

А затем используйте его в представлении так:

@categories.each do |category|
  link_to category.title, category

  category.posts.highlights.each do |post|
    link_to post.title, post
  end
end

Если вы хотите иметь возможность настраивать длину подсветки, вы можете изменить вызов видимости следующим образом:

scope :highlights lambda { |size| { published.limit(size) } }

, а затем используйте его как:

category.posts.highlights(5) 
0 голосов
/ 20 июля 2011

вы можете создать объект в контроллере как:

def index
  @published_posts = @categories.collect { |c| c.posts.published.limit(4) }
  # but this will be an array of arrays, so let flatten
  @published_posts = @published_posts.flatten # array of published posts
end

теперь вы можете использовать эту переменную в своих представлениях.

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