Мой вопрос заключается в следующем: как улучшить рельсы код модели, такие, как это:Rails: улучшить, если заявления в модели
class Event < ActiveRecord::Base
scope :upcoming, -> { where('date >= ?', Time.now)
.includes(:groups, :creator)
.reorder(date: :asc) }
scope :past, -> { where('date < ?', Time.now)
.includes(:groups, :creator) }
scope :connected, -> (user) {
user_groups_ids = user.groups_teacher.pluck(:id).uniq
joins(:groups).where('groups.id': user_groups_ids).uniq
}
scope :created, -> (user) {
where(user_id: user.id)
}
scope :filtered, -> (args) {
filter = args[:filter]
kind = args[:kind]
if(filter == 'upcoming' && kind == 'connected')
upcoming.connected(args[:user])
elsif(filter == 'upcoming' && kind == 'created')
upcoming.created(args[:user])
elsif(filter == 'past' && kind == 'connected')
past.connected(args[:user])
elsif(filter == 'past' && kind == 'created')
past.created(args[:user])
elsif(filter == 'upcoming')
upcoming
elsif(filter == 'past')
past
else
all
end
}
belongs_to :creator, class_name: "User", foreign_key: "user_id"
has_many :groups, through: :group_events
has_many :group_events
accepts_nested_attributes_for :groups
self.per_page = 5
end
Я специально говорю о "фильтрованной области видимости. В моих событиях index index acion я всегда вызываю фильтрованную область, предоставляющую «фильтр» и «вид» из параметров для получения правильных событий, но я не могу найти способ не использовать эти уродливые операторы if. Моя главная цель - сделать его SOLID.
Right. Прямо из официального ** интерфейса API запросов ActiveRecord **: [«Использование метода класса является предпочтительным способом принятия аргументов для областей».] (Http://guides.rubyonrails.org/active_record_querying.html#passing-in- аргументы). –
@muistooshort есть причина, почему метод класса предпочтительнее аргументов принятия области? – MrYoshiji
@MrYoshiji Вероятно, потому что он менее грязный, и он «просто дублирует функциональность, которая будет предоставляться вам методом класса». Вы имели обыкновение говорить 'scope: s, где (...)' (т. Е. Нет лямбда), поэтому 'scope' был удобной стенографией; теперь немного менее удобно, когда требуются лямбда, и область, которая больше, чем один вызов 'where', быстро становится нечитаемым беспорядком. Я уверен, что за «областью» больше истории, поскольку они затащили ее в ногу и кричали в будущее, но я не знаю этого с головы. –