【问题标题】:Custom order for an activerecord collection活动记录集合的自定义顺序
【发布时间】:2021-09-29 07:27:53
【问题描述】:

我无法解决我认为的问题。

我必须在页面上显示来自我的Content 课程的内容集合。 我的Content 类有一些定义内容类型的子类:“新闻”、“评论”、“视频”等。

在我看来,我需要以自定义顺序呈现内容列表:

news
news
news
news
content of any other type
news
news
news
news
content of any other type
...

基本上我需要每 4 个新闻显示一个不是新闻的内容。

此时在我的控制器中我有

all_contents = @special_page.contents
@news = all_contents.select { |c| c.type == 'News' }
@contents = all_contents - @news  

@contents 是一个对象数组,其中每个内容都不是新闻,并且在视图中有一些技巧(使用枚举器中的索引)我能够获得我需要的东西。

但后来我意识到我有一个问题:我有 Kaminari 用于分页,当我请求下一页时,我无法使用这个系统来处理第二页。

所以我需要获取已订购的内容集合,但我不明白如何。

【问题讨论】:

  • 你有1个分页元素还是每个新闻块都有相似的元素?
  • 每个元素都有相同的属性,但我对新闻和其他内容有不同的部分,所以我需要为新闻渲染一个部分,为其他类型渲染另一个部分
  • 如果您需要对结果进行分页,您需要在数据库中进行排序。只需使用 order 和 case 语句即可根据类型以自定义顺序选择内容。 ORDER BY case contents.type WHEN 'news' THEN 1 ...。但是,您需要在每 4 行执行其他操作的要求要求您使用窗口函数 (RANK OVER ...) 之类的东西。我不是 100% 确定如何解决它,但您很可能希望设置一个范围以按照您想要的顺序获取所有内容并在 FROM 子句中使用它。
  • content = Content.from(Content.my_custom_order, :contents).paginate(...)。最好的方法将在很大程度上取决于您使用的 RDBMS。我最好的建议是将问题从 Rails 问题改写为 SQL 问题。添加表格、数据和预期结果的良好示例,并使用您的 RDBMS(postgres、mysql)等标记问题。这些标签的追随者在 SQL 方面比普通 Rails 开发人员更熟练。
  • 实际上呈现记录将是容易的部分。 “Rails 通过查看集合中的模型名称来确定要使用的部分的名称。事实上,您甚至可以创建一个异构集合并以这种方式呈现它,Rails 将为集合的每个成员选择适当的部分” guides.rubyonrails.org/…

标签: ruby-on-rails activerecord


【解决方案1】:

可能只是对“新闻”进行分页并在视图中(甚至在控制器中)放置一些逻辑,

@news.each_with_index do |item, index|
  if index % 4 == 0
     = render 'some_other_item'
  end
  = render 'post', post: item
end

我想你理解这个想法

【讨论】:

  • 这就是我现在正在做的事情。但是当我调用第二页时,我失去了内容......这就是为什么我要尝试获取已经订购的集合
  • 这实际上不会解决任何问题。您只需传递render collection: @news,rails 将根据类名自动呈现正确的部分。这个问题实际上更像是一个 SQL 问题,首先是对记录进行排序,并且没有 ruby​​ 循环能够以可扩展的方式解决这个问题。
  • @RobertoPezzali 从根本上说,您是在说“我有两个不同的集合需要在视图中交错”。您是否考虑过将它们视为以不同大小分页的不同集合?例如,如果您想在一个页面上显示 25 个项目,则将页面大小为 20 的“新闻”项目和页面大小为 5 的“其他”项目分页。@news = Content.where(type: 'news')@contents = Content.where.not(type: 'news') 应该会有所帮助
猜你喜欢
  • 1970-01-01
  • 2012-04-29
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2016-07-21
相关资源
最近更新 更多