Rails 4:如何将循环逻辑放入控制器内部

Rails 4: How to put loop logic inside the controller

我的 haml 文档中有四个循环用于测试目的,唯一的区别是元素的顺序。

我是否能够以某种方式将逻辑放入我的控制器中,并在我的 haml 文档中仅列出一次循环的整个 'insidyness'?
目前,我将所有内容都复制了 4 次,你知道,这感觉很糟糕。 :)

例如:

- @loop.where(featured: true).order("RANDOM()").limit(4).each do |item|
    %li
        %h1 This is an example
- @loop.order(:cached_votes_up => :desc).limit(4).each do |item|
    %li
        %h1 This is an example
- @loop.order(:impressions_count => :desc).limit(4).each do |item|
    %li
        %h1 This is an example
- @loop.order("created_at DESC").limit(4).each do |item|
    %li
        %h1 This is an example

控制器:

def index
    @loop = Item.all
end

我想将我的 Haml 代码缩减为这样的代码,并将其余代码移至控制器中:

- @loop.each do |item|
    %li
        %h1 This is an example

预先感谢每个回答!

Item 模型中 class:

scope :featured_with_random_order_desc, ->(limit_value) { where(featured: true).order("RANDOM()").limit(limit_value) }

scope :by_cached_votes_order_desc, ->(limit_value) { order(:cached_votes_up => :desc).limit(limit_value) }

scope :by_impression_count_order_desc, ->(limit_value) { order(:impressions_count => :desc).limit(limit_value) }

scope :by_created_at_desc, ->(limit_value) { order("created_at DESC").limit(limit_value) }

您认为:

- @loop.featured_with_random_order_desc(4).each do |item|
    %li
        %h1 This is an example
- @loop.by_cached_votes_order_desc(4).each do |item|
    %li
        %h1 This is an example
- @loop.by_impression_count_order_desclimit(4).each do |item|
    %li
        %h1 This is an example
- @loop.by_created_at_desc.limit(4).each do |item|
    %li
        %h1 This is an example

您可以更进一步,为控制器中的每个循环创建变量:

def index
  @loop_featured = Item.featured_with_random_order_desc(4)
  @loop_cached_votes = Item.by_cached_votes_order_desc(4)
  @loop_impression_counts = Item.by_impression_count_order_desclimit(4)
  @loop_by_created = Item.by_created_at_desc(4)
end

并在视图中使用它们:

- @loop_featured.each do |item|
  %li
    %h1 This is an example
- @loop_cached_votes.each do |item|
  %li
    %h1 This is an example
- @loop_impression_counts.each do |item|
  %li
    %h1 This is an example
- @loop_by_created.each do |item|
  %li
    %h1 This is an example

您不能多次渲染视图,但您可以这样做。

def index
  @loops = [
    Item.where(featured: true).order("RANDOM()"),
    Item.order(:cached_votes_up => :desc),
    Item.order(:impressions_count => :desc),
    Item.order("created_at DESC")
  ]
end

然后在模板中

- @loops.each do |loop|
 - loop.limit(4).each do |item|
   %li
     %h1 This is an example

您可以使用 ActiveRecord

中的 union_scope
    #item.rb

    include ActiveRecord::UnionScope
    scope :by_random, -> { where(featured: true).order("RANDOM()").limit(4) }
    scope :by_cached_votes, ->{ order(:cached_votes_up => :desc).limit(4) }
    scope :by_impression_count, ->{ order(:impressions_count => :desc).limit(4) }
    scope :by_created_at, ->{ order("created_at DESC").limit(4) }

    scope: all_conditions, -> { union_scope(by_random, by_cached_votes,by_impression_count,by_created_at}

你的控制器

@item = Item.all_conditions

您的看法:

- @loop.all_conditions.each do |item|