Расширения has_many, динамические условия кэшируются?Нужно ли лямбда-выражение для подавления кэширования? - PullRequest
1 голос
/ 22 ноября 2011

Я поддерживаю приложение Rails 2.3.x.Часть этого касается пользователей и ролей.Пользователь может иметь несколько ролей, каждая на определенный период или на неопределенный срок.Я пытаюсь написать расширение has_many, чтобы быстро найти все роли, которые в данный момент активны у пользователя.Он включает в себя написание расширения has_many из-за логики поиска соответствия активной роли для текущего времени.

Таким образом, модели выглядят так:

class User
  has_many :role_user_matchings
  has_many :roles, :through => :role_user_matchings do
    def active
      find(:all, :conditions => ['matchings.starts_at <= ? AND (? < matchings.ends_at OR matchings.ends_at IS NULL)', Time.now, Time.now])   
  end
end

class RoleUserMatching
  belongs_to :user
  belongs_to :role
  # has fields like starts_at and ends_at
  # ends_at can be null, meaning indefinitely
end


class Role < AR:Base
  has_many :role_user_matchings
  has_many :users, :through => :role_user_matchings
end

Мне нужно знать активные в настоящее время роли дляПользователь каждый раз, когда выполняется что-то подобное:

@user.roles.active

Поскольку назначения ролей могут часто меняться или в зависимости от времени, я должен убедиться, что роли возвращаются в зависимости от текущего времени.

Итакпохоже, работает в режиме разработки. Мне интересно, кэшируются ли вызовы Time.now выше в этой ситуации в производственном режиме? Был бы признателен, если бы кто-то мог также объяснить, почему или почему нет.Спасибо.

В качестве примечания: я знаю, что с named_scopes, чтобы избежать кэширования, вам нужно использовать лямбда-выражение

# call to 1.week.ago will be cached and will remain the same until restart
named_scope :recent,  { :conditions => ['created_at > ?', 1.week.ago] }
# 1.week.ago will not be cached first
named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } }

Интересно, относится ли оно к расширениям ассоциации.

1 Ответ

0 голосов
/ 22 ноября 2011

Без фактического запуска вашего кода, я собираюсь перейти к «нет», он не кешируется.Причина в том, что ваше расширение является определением метода и не будет выполняться при загрузке класса.Причина, по которой именованные области кэшируются (без лямбды), заключается в том, что этот код выполняется при загрузке класса.Он будет оценивать любое выражение, поэтому в первом примере он оценивает хеш, но во втором примере он оценивает лямбдувернемся к ролевым моделям?Должна ли модель User знать, что значит активная роль, или ей просто важно, активна она или нет?

class Role
  named_scope :active, lambda { { :conditions => ['matchings.starts_at <= ? AND (? < matchings.ends_at OR matchings.ends_at IS NULL)', Time.now, Time.now] }}
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...