Вы можете иметь явные области для обоих, или у вас может быть одна область, которая выбирает для вас на основе ptype, или вы можете метапрограммировать область для каждого уникального ptype в базе данных. Если вы добавляете различные «ptypes» вы можете сделать одно из следующих действий, который даст вам простор для обработки любых «ptypes»:
scope :ptype, -> (ptype) { where(ptype: ptype) }
называется:
ProjectType.ptype('web')
или
class ProjectType < ActiveRecord::Base
self.pluck(:ptype).each do |ptype|
scope ptype.gsub(/\s+/,"_").downcase.to_sym, -> { where(ptype: ptype) }
end
end
Я не рекомендую это, и я также не рекомендую отдельные области для каждой «строки» (например, ProjectType.web или ProjectType.mobile). Лучший баланс - передать строковое значение в область, которая извлекает то, что вы ищете. Просто мое мнение, я уверен, что у других это по-другому.
Если честно, я думаю, что поле ptype созрело для перечислителя - это даст некоторую ясность в вашем коде и определит, что именно на самом деле ожидает это поле, а не позволяет помещать туда любую строку. Так что-то вроде:
class ProjectType < ActiveRecord::Base
enum ptype: [:web, :mobile]
scope :ptype, -> (ptype) { where(ptype: self.ptypes[ptype] }
end
и называется так:
ProjectType.ptype(:web)
Я не думаю, что какой-либо один из этих решений, представленных здесь, или выше, больше «вправо», за исключением решения мета-программирования это создает область для каждой строки в поле ptype, хранящемся в базе данных.
Наконец, здесь есть простор для Вашего портфолио:
class Portfolio < ActiveRecord::Base
scope :by_ptype, -> (ptype) { joins(:project_type).merge(ProjectType.ptype(ptype) }
end
И называется так:
Portfolio.by_ptype(:web)
Как 'scope: web, -> {где (ptype: 'web')}'? – Stefan
@Stefan будет возвращать список типов проектов, а не портфолио – MaruniakS