具有多个值的命名范围

时间:2016-07-28 16:00:29

标签: ruby-on-rails

我的命名范围有问题。

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

当我使用多个值调用此范围时,arr = ["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

1 个答案:

答案 0 :(得分:0)

在你的模特中试试这个:

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

然后在您的代码中,您可以致电:

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

这也可以灵活地采用一个参数:

Shipment.by_status('New')