Я поддерживаю приложение 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] } }
Интересно, относится ли оно к расширениям ассоциации.