Динамическая область действия с методом или в Rails 5 - PullRequest
0 голосов
/ 24 сентября 2018

Некоторые области действия моей модели юнитов:

class Unit < ApplicationRecord
  scope :committees,   -> { where(unit_type: UnitType.committee) }
  scope :departments,  -> { where(unit_type: UnitType.department) }
  scope :faculties,    -> { where(unit_type: UnitType.faculty) }
  scope :programs,     -> { where(unit_type: UnitType.program) }
  scope :universities, -> { where(unit_type: UnitType.university) }
end

class UnitType < ApplicationRecord
  enum group: {
    other: 0,
    university: 1,
    faculty: 2,
    department: 3,
    program: 4,
    committee: 5
  }
end

Я хочу создать новую область с использованием других областей, например:

class Unit < ApplicationRecord
  ...
  scope :for_curriculums, -> { universities.or(faculties).or(departments) }
  scope :for_group_courses, -> { faculties.or(departments) }
  ...
end

Но в этом случае слишком много двойных-тройныхпроисходят комбинации.

Когда я использую параметр send, как в следующем коде, вместо метода or или выполняется метод 'и'.

class Unit < ApplicationRecord
  ...
  # unit_types = ['faculties', 'departments']
  def self.send_chain(unit_types)
    unit_types.inject(self, :send)
  end
end

Как это сделать, есть ли возможность

1 Ответ

0 голосов
/ 24 сентября 2018
class Unit < ApplicationRecord
  UnitType.groups.each do |unit_type|
    scope ActiveSupport::Inflector.pluralize(unit_type), -> { 
      where(unit_type: unit_type)
    }
  end

  scope :by_multiple_unit_types, ->(unit_types) {
    int_unit_types =  unit_types.map { |ut| UnitType.groups.index(ut) }.join(',')
    where("unit_type IN (?)", int_unit_types)
  }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...