【发布时间】: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