如何限制在视图中加载的记录数?

时间:2012-12-24 17:23:40

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

此代码显示属于当前社区的CommunityTopic的所有记录。 如何将数字限制为10条记录显示在这里?

<ul>
  <% @community.community_topics.each do |topic| %>
    <li>
    <%= link_to topic.title, community_topic_path(@community, topic) %>
    <%= link_to topic.user.user_profile.nickname, community_topic_path(@community, topic) %>
    </li>
  <% end %>
</ul>

3 个答案:

答案 0 :(得分:8)

使用limit方法:

<% @community.community_topics.limit(10).each do |topic| %>

这只会将集合的前10个元素提供给块。如果您想要更复杂,可以使用类似will_paginate的内容。

通常,此类数据提取应在控制器中进行。因此,不是在视图获取数据的情况下使用@community变量,而是使用@community_topics,并预先填充要渲染的数据。

答案 1 :(得分:2)

通常不应该在视图中执行此操作,而应在控制器中执行此操作。您可以使用limit作为@Fermaref建议,或者您可以使用分页器来帮助您,例如will_paginate或kaminari。

要将其移至控制器,请尝试以下操作:

def some_action
  @community = Community.find(params[:id])
  @community_topics = @community.community_topics.order(:some_attribute).limit(10)
end

然后在视图中使用@community_topics。这里的一个优点是,您现在可以将此逻辑移动到私有方法,以便在需要时重用。您还可以在功能上测试@community_topics限制为10行。

答案 2 :(得分:0)

使用8.3重新排序

重新排序方法会覆盖默认范围顺序。例如:

@categories = Category.includes(:subcategories).where(active: true).references(:subcategories).order(name: :asc).reorder('categories.name ASC', 'subcategories.name ASC')

http://guides.rubyonrails.org/active_record_querying.html