Почему бы не создать метод класса [1], as_manager
. Что-то вроде:
class Employee < ApplicationRecord
has_many :subordinates, class_name: "Employee", foreign_key: "manager_id"
belongs_to :manager, class_name: "Employee"
class << self
def as_manager
where(is_manager: true)
end
end
end
Тогда вы должны быть в состоянии сделать:
Employee.as_manager.subordinates
Или, учитывая ваши «бизнес-требования» (очень странно, что у бизнеса будут требования для такого уровня детализации реализации), как насчет того, чтобы просто исключить метод subordinates
, предоставленный директивой has_many
?
class Employee < ApplicationRecord
has_many :subordinates, class_name: "Employee", foreign_key: "manager_id"
belongs_to :manager, class_name: "Employee"
def subordinates
is_manager ? where(manager_id: id) : []
end
end
Таким образом, вы можете сохранить все другие методы, предоставляемые has_many
, но получить поведение, которое вы хотите для subordinates
.
[1] Йорг Миттаг желает заявить:
Я один из тех Ruby Purists, которому нравится указывать на то, что в Ruby нет такого понятия, как метод класса. Тем не менее, я в полном порядке, используя термин метод класса в разговорной речи, , пока все стороны полностью понимают, что речь идет о разговорной речи . Другими словами, если вы знаете , что не существует такого понятия, как метод класса, и что термин «метод класса» просто сокращен от «метод экземпляра синглтон-класса объекта, который является экземпляром Class
", тогда проблем нет. Но в остальном я видел, как это мешало пониманию.
Пусть все стороны полностью поймут, что термин метод класса используется выше в разговорном смысле.