Неэффективно ли постоянно вызывать родительскую модель для определенных c атрибутов данных? - PullRequest
0 голосов
/ 12 февраля 2020

Скажем, на каком-то методе Child мне нужно сделать расчеты на основе данных, хранящихся на его Parent модели. Например,

def child_method(minutes)
   remaining_time = minutes % self.parent.parent_settings
   if remaining_time >= 1
       return minutes/ self.parent.parent_settings
   else
       return [minutes/self.parent.parent_settings - 1 , 0].max
   end
end

В вышеупомянутом я звонил self.parent.parent_settings 3 раза. На основании того, как работает Rails, это эффективно? Или это ужасная идея, и я должен вместо этого установить parent_settings локально, например:

def child_method(minutes)
   parent_settings = self.parent.parent_settings
   remaining_time = minutes % parent_settings
   if remaining_time >= 1
       return minutes/ parent_settings
   else
       return [minutes/parent_settings - 1 , 0].max
   end
end

У меня есть более сложные случаи этого (например, где в одном дочернем методе я обращаюсь к нескольким родительские атрибуты, а также, в некоторых случаях, родительские атрибуты). Я понимаю, что ответ может быть «это зависит» от того, какие именно данные, и т. Д. c., Но я хочу посмотреть, есть ли общие правила или соглашение

1 Ответ

1 голос
/ 12 февраля 2020

Как вы сказали, это зависит.

Rails будет кэшировать извлеченные ассоциации, пока объект остается в памяти:

puts self.parent.parent_settings.object_id
# ... Some code
puts self.parent.parent_settings.object_id # => This should be the same object ID as before

Этот кеш очищается платформой автоматически и может быть явно очищается с помощью #reload:

self.reload

Ваш код должен быть в порядке, если вы не выполняете child_method несколько раз в цикле запроса / ответа. Даже если вы выполняете child_method несколько раз в одном и том же цикле запросов / ответов, есть еще один кеш запросов к базе данных, который будет перехватывать одни и те же запросы БД. Кэш запросов БД активен только в рабочем режиме или при установке специальной переменной ENV.

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