2016-07-28 102 views
0

我在命名范围上遇到了一些麻烦。具有多个值的命名范围

def self.by_status(status) 
    arr = status.split(',').map{ |s| s }   
    logger.debug "RESULT: #{arr.inspect}" 
    where(status: arr) 
end 

当我把这个范围有不止一个值,编曲的结果= ["New", "Open"]

这不返回任何结果,而它应该。如果我在控制台中试用这个命令:Shipment.where(status: ['New', 'Open'])我得到了我期待的结果。

我在这里错过了什么吗?

编辑(添加类方法的调用):

def self.to_csv(options = {}, vendor_id, status) 
    CSV.generate(options) do |csv| 
    csv << column_names 

    if !vendor_id.blank? && status.blank? 
      by_vendor_id(vendor_id).each do |product| 
      csv << product.attributes.values_at(*column_names) 
     end 
     elsif !vendor_id.blank? && !status.blank? 
      by_vendor_id(vendor_id).by_status(status).each do |product| 
      csv << product.attributes.values_at(*column_names) 
     end 
     elsif vendor_id.blank? && !status.blank? 
     logger.debug "by_status result: #{by_status(status).inspect}" 
      by_status(status).each do |product| 
      csv << product.attributes.values_at(*column_names) 
     end  
     else 
     all.each do |product| 
      csv << product.attributes.values_at(*column_names) 
     end 
    end 
    end 
end 
+0

好吧,你能告诉你如何在你的应用程序中调用类方法'by_status'。顺便说一下你所称的_class method_,而不是_named的scope_。阅读[this](http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/)知道为什么。 –

+0

我会用我的电话更新我的帖子。上下文是,我将参数从我的数据表传递到我的控制器,然后传递给我的模型。我试图使用这些参数导出到csv。 – stoerebink

回答

0

试试这个模型中:

scope :by_status, ->(*statuses) { where(status: statuses) } 

然后在你的代码,你可以拨打:

Shipment.by_status('New', 'Open') 

这也具有只需要一个参数的灵活性:

Shipment.by_status('New') 
+0

我的输入来自一个像这样的参数:'Open,New',所以我必须将它们分开,然后将它们传递给范围。这是行不通的 – stoerebink

+0

然后,也许你只需要在你的'#split'中包含一个空格:'split(',')' – user3680688

+0

分割的工作,但由于某种原因的范围没有:( – stoerebink