Skip to main content
 首页 » 编程设计

ruby-on-rails之使用 current_scope 或在模型的类方法中创建新的惯用方法是什么

2024年09月03日14lyj

我想在这样的链中使用 to_csv 方法 Company.where(created_at: '2010-01-01').limit(20).to_csv

为此,我使用了 current_scope,它运行良好。但是当像这样调用相同的方法时 Company.to_csv 它会提示,因为 current_scope 是 nil。

现在我正在使用 (current_scope || where(true)) 这对我有用,但也许有一种“正确”的方法来做到这一点?

  def self.to_csv 
    CSV.generate do |csv| 
      (current_scope || where(true)).includes(:_address).each do |company| 
        csv << company.attributes 
      end 
    end 
  end 

附言。我知道我可以只使用 current_scope 并调用 Company.all.to_csv,但这不是这个问题的目的。

请您参考如下方法:

我知道我迟到了。我试图找到与 current_scope 对应的方法并偶然发现了您的问题(并找到了我宝贵的 current_scope 方法,谢谢)。

我认为对于你的情况,你可以这样写:

def self.to_csv 
  CSV.generate do |csv| 
    includes(:_address).each do |company| 
      csv << company.attributes 
    end 
  end 
end 

您不必使用 current_scope 方法,因为 Rails 已经为您完成了。

如果您想知道为什么我必须去寻找 current_scope,我不得不像 n 次一样链接到 current_scope,请看这里:

def self.search(terms) 
  terms = Array(terms) 
  return all if terms.blank? 
  filtered = current_scope || all 
  terms.each do |term| 
    filtered = filtered.search_scope(term) 
  end 
  filtered 
end 
 
def self.search_scope(term) 
  # logic for scope on 1 term  
  # returns a scope 
end 

所以我可以这样调用:MyModel.search(['test1', 'test2']).limit(5)MyModel.limit(5).search('测试')