У меня есть направляющие 3 проекта. С направляющими 3 прибыл Arel и способность снова использовать один объем для создания другого. Я задаюсь вопросом, существует ли способ использовать объемы при определении отношений (например, "has_many").
У меня есть записи, которые имеют столбцы разрешения. Я хотел бы создать default_scope, который принимает мои столбцы разрешения во внимание так, чтобы были фильтрованы записи (даже те, к которым получают доступ через отношения).
В настоящее время, в направляющих 3, default_scope (включая патчи я нашел) не обеспечивают осуществимое средство передачи proc (в котором я нуждаюсь для последней привязки переменной). Действительно ли возможно определить has_many, в который может быть передан именованный объем?
Идея снова использовать именованный объем была бы похожа:
Orders.scope :my_orders, lambda{where(:user_id => User.current_user.id)}
has_many :orders, :scope => Orders.my_orders
Или неявно кодирование, которое назвало объем в отношениях, будет похоже:
has_many :orders, :scope => lambda{where(:user_id => User.current_user.id)}
Я просто пытаюсь применить default_scope с поздним связыванием. Я предпочел бы использовать подход Arel (если бы существует один), но использовал бы любую осуществимую опцию.
Так как я обращаюсь к текущему пользователю, я не могу полагаться на условия, которые не оценены в прошлый момент, такой как:
has_many :orders, :conditions => ["user_id = ?", User.current_user.id]
Я предлагаю вам взглянуть на «Именованные прицелы мертвы»
Автор объясняет, насколько мощны Arel is:)
Надеюсь, это поможет.
Как отмечается в некоторых комментариях, разница теперь зависит от личного вкуса.
Тем не менее, я по-прежнему лично рекомендую избегать раскрытия области видимости Arel на более высоком уровне (будучи контроллером или чем-либо еще, имеющим прямой доступ к моделям), и для этого потребуется:
Я использую что-то вроде:
class Invoice < ActiveRecord::Base
scope :aged_0, lambda{ where("created_at IS NULL OR created_at < ?", Date.today + 30.days).joins(:owner) }
end
Вместо областей видимости я только что определил методы классов, которые отлично работают
def self.age0 do
where("blah")
end