Какой код в Rails не оценивается во время выполнения (например, области ActiveRecord и т. Д.) - PullRequest
1 голос
/ 21 февраля 2012

Если вы попытаетесь оценить текущую дату в области ActiveRecord, она, скорее всего, будет неправильной из-за ее оценки при загрузке кода приложения, а не во время выполнения.Вы должны передать это через лямбду, например:

scope :today, lambda { where(:submitted_at => Date.today.to_time.utc..(Date.today + 1).to_time.utc) }

Это забавный пример, потому что происходит преобразование во время.Несмотря на это, мой вопрос , где еще это вызывает беспокойство? Являются ли области ActiveRecord единственным местом, где я могу рассчитывать на то, что мои вызовы Date не будут оцениваться во время выполнения?

1 Ответ

2 голосов
/ 21 февраля 2012

Когда вы объявляете scope, вы вызываете метод scope для самого класса. Это делается, как вы сказали, во время загрузки, а не во время выполнения.

Это происходит каждый раз, когда вы вызываете метод класса в его объявлении. Некоторые примеры:

class Car < ActiveRecord::Base
  acts_as_combustion_machine
  belongs_to :driver
  has_many :wheels
end

Это примеры методов, которые вызываются самому классу во время его объявления. Это означает, что любой из его параметров будет оцениваться во время загрузки, а не во время выполнения.

Давайте рассмотрим еще один пример. Если вы хотите указать engine для acts_as_combustion_machine, вы можете сделать что-то вроде:

acts_as_combustion_machine Engine.first

Примите во внимание, что это будет оцениваться во время загрузки класса (так же, как для даты).

Я думаю, это поможет вам прояснить причину этого немного подробнее ... но, пожалуйста, не стесняйтесь задавать другие вопросы. Мне потребовалось немного, чтобы понять это сам;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...