【问题标题】:How can I limit the number of records to load in view???如何限制视图中加载的记录数???
【发布时间】:2012-12-24 17:23:39
【问题描述】:

此代码显示了属于当前社区的 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>

【问题讨论】:

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


【解决方案1】:

使用limit 方法:

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

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

一般而言,此类数据获取应在控制器中进行。因此,不要使用 @community 变量来让视图从中获取数据,而要使用 @community_topics 来预填充您要呈现的数据。

【讨论】:

  • 你最好使用limit(10),因为take来自Array,所有community_topics都会在内存中获取,虽然只会显示10个。
  • 所以“限制”消耗的内存更少??
  • limit 会将数据库查询更改为仅获取前 10 条记录。 take 将触发查询(所有记录)构建一个数组,然后将数组截断为前 10 条记录。
【解决方案2】:

您通常不应该在视图中执行此操作,而应在控制器中执行此操作。您可以按照@Fermaref 的建议使用limit,也可以使用分页器来帮助您,例如 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 行。

【讨论】:

  • 鉴于我不应该这样做的原因是什么?如果我在当前 Community#show 中显示 10 个最新主题怎么办?我应该使用这种方式吗?如果他们想查看更多内容,可以按“全部显示”并移至 CommunityTopic#index
  • 在视图中修改/截断集合被认为是糟糕的设计,因为它会使您的逻辑更难测试、调试和重构。有时没办法,但渲染的数据收集尽可能属于控制器。
  • 好的,这是有道理的,非常感谢!在这种情况下,如何将其替换为基于控制器的?
  • 更新澄清。请注意,我添加了一个 order 子句,因此主题将以可预测的方式返回 - 将 :some_attribute 替换为对您的情况有意义的任何内容。如果关联被硬编码为使用特定顺序,则没有必要。
  • 你当然可以。出于同样的原因,这通常也会出现在控制器中。
【解决方案3】:

使用 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

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多