在现有方法链的中间调用方法链

时间:2015-12-10 18:56:22

标签: ruby-on-rails ruby

我如何send使用方法链的一个方法链的结果?

例如:

class MyController < ApplicationController
  def index
    @collection = @resource.sub_resources.send(index_scope).paginate(page: params[:page], per_page: 50)
  end  


  private

    def index_scope
      MyModel.approved.today
    end
end

index_scope返回适当模型的范围链。有没有办法将这些范围链接到我在send(index_scope)方法中调用index的位置? send(index_scope)无效,只是我最近的尝试。

我想到的另一个选项是将范围名称放在一个数组中,然后连续调用每个。这意味着index_scope更改为:

def index_scope
  [:approved, :today]
end

这会将方法更改更改为:

@collection ||= @location
  .send(controller_name)
  .tap do |o|
    index_scope.each { |method| o.send(method) }
  end
  .paginate(page: params[:page], per_page: per_page)

但我想知道Ruby是否有更好的方法。

2 个答案:

答案 0 :(得分:2)

您也可以执行类似

的操作
class MyController < ApplicationController
  def index
    @collection = scoped_for_index(@resource.sub_resources).paginate(page: params[:page], per_page: 50)
  end  


  private

  def scoped_for_index(collection)
    collection.approved.mine
  end
end  

答案 1 :(得分:0)

您可以merge两个范围:

def index
  @collection = @resource.sub_resources.merge(index_scope).paginate(...)
end

def index_scope
  MyModel.approved.mine
end