如何通过收集将范围应用于关联?

时间:2011-07-20 11:48:13

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有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 个答案:

答案 0 :(得分:1)

我会在Post上创建一个封装已发布和限制的范围:

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) 

答案 1 :(得分:0)

你可以在控制器中创建一个对象,如:

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

现在您可以在视图中使用此变量。