Как Вы определяете объем ассоциаций ActiveRecord в направляющих 3?

У меня есть направляющие 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]
59
задан Mario 10 March 2010 в 14:04
поделиться

3 ответа

Я предлагаю вам взглянуть на «Именованные прицелы мертвы»

Автор объясняет, насколько мощны Arel is:)

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ №1 Март 2014 г.

Как отмечается в некоторых комментариях, разница теперь зависит от личного вкуса.

Тем не менее, я по-прежнему лично рекомендую избегать раскрытия области видимости Arel на более высоком уровне (будучи контроллером или чем-либо еще, имеющим прямой доступ к моделям), и для этого потребуется:

  1. Создать область видимости и раскрыть ее через в вашей модели. Этот метод будет тем методом, который вы предоставляете контроллеру;
  2. Если вы никогда не открываете свои модели для своих контроллеров (так что у вас есть какой-то уровень обслуживания поверх них), тогда все в порядке. Уровень защиты от коррупции - это ваша служба, и он может получить доступ к области действия вашей модели, не беспокоясь о том, как реализованы области.
21
ответ дан 24 November 2019 в 18:30
поделиться

Я использую что-то вроде:

class Invoice < ActiveRecord::Base
  scope :aged_0,  lambda{ where("created_at IS NULL OR created_at < ?", Date.today + 30.days).joins(:owner) }
end 
10
ответ дан 24 November 2019 в 18:30
поделиться

Вместо областей видимости я только что определил методы классов, которые отлично работают

def self.age0 do
  where("blah")
end
15
ответ дан 24 November 2019 в 18:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: