Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用';或';数组中的子句_Ruby On Rails_Rails Activerecord - Fatal编程技术网

Ruby on rails 如何使用';或';数组中的子句

Ruby on rails 如何使用';或';数组中的子句,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我有一个数组,我想用或子句调用作用域: cars = ['bmw', 'audi', 'toyota'] class Car < AR scope :from_bmw, -> { where(type: 'bmw') } scope :from_audi, -> { where(type: 'audi') } scope :from_toyota, -> { where(type: 'toyota') } end 我的cars数组可以更改;如果:cars=

我有一个数组,我想用
子句调用作用域:

cars = ['bmw', 'audi', 'toyota']

class Car < AR
  scope :from_bmw, -> { where(type: 'bmw') }
  scope :from_audi, -> { where(type: 'audi') }
  scope :from_toyota, -> { where(type: 'toyota') }
end
我的
cars
数组可以更改;如果:
cars=['toyota'、'audi']
,我的方法应该产生:

Car.from_toyota.or(Car.from_audi)
我有如下几点:

def generate(cars)
  scopes = cars.map {|f| "from_#{f} "}

  scopes.each do |s|
    # HOW TO I ITERATE OVER HERE AND CALL EACH SCOPE???
  end
end

我不想将type作为参数传递给scope,这是有原因的。

假设给定数组只包含有效的
type
值,您可以简单地执行以下操作:

def generate(cars)
  return Car.none if cars.blank?
  scopes = cars.map {|f| "from_#{f} "}

  scope = Car.send(scopes.shift)

  scopes.each do |s|
    scope = scope.or(Car.send(s))
  end

  scope
end
class Car
  scope :by_type, -> (type) { where(type: type) }
end

types = ['bmw', 'audi', 'toyota']

Car.by_type(types) # => It'll generate a query using IN: SELECT * FROM cars WHERE type IN ('bmw', 'audi', 'toyota')
如果出于任何原因不想将数组作为参数传递给作用域,可以创建一个散列,将数组值映射到有效的
by\u type
参数

VALID_CAR_TYPES = { volkswagen: ['vw', 'volkswagen'], bmw: ['bmw'], ...  }
def sanitize_car_types(types)
  types.map do |type|
    VALID_CAR_TYPES.find { |k, v| v.include?(type) }.first
  end.compact
end


Car.by_type(sanitize_car_types(types))

假设给定数组只包含有效的
类型
值,您只需执行以下操作:

class Car
  scope :by_type, -> (type) { where(type: type) }
end

types = ['bmw', 'audi', 'toyota']

Car.by_type(types) # => It'll generate a query using IN: SELECT * FROM cars WHERE type IN ('bmw', 'audi', 'toyota')
如果出于任何原因不想将数组作为参数传递给作用域,可以创建一个散列,将数组值映射到有效的
by\u type
参数

VALID_CAR_TYPES = { volkswagen: ['vw', 'volkswagen'], bmw: ['bmw'], ...  }
def sanitize_car_types(types)
  types.map do |type|
    VALID_CAR_TYPES.find { |k, v| v.include?(type) }.first
  end.compact
end


Car.by_type(sanitize_car_types(types))

勾选此项您可以做一个简单的
汽车。where(type:cars)
勾选此项您可以做一个简单的
汽车。where(type:cars)