vladamir
@vladamir

Как указать значения по умолчанию в модели в рельсах?

Привет всем. Изучаю рельсы, но найти на этот вопрос ответа нигде не могу, либо просто не могу понять, почему не работает.

Есть запрос

@conversion = Conversion.joins(:track)
    .select('SUM(conversions.revenue) as sum_revenue, COUNT(*) as count_conversions')
    .group('tracks.campaign_id')
    .where(:tracks => { :campaign_id => campaign_id })
    .order('tracks.campaign_id ASC')
    .first


Я вот хочу чтобы у меня при вызове @conversion.count_conversions не возникало undefined method `count_conversions' for nil:NilClass - а это возникает тогда, когда при агрегации у нас пуст @conversion

Я как понимаю, что могу это обойти с помощью

!@conversion.blank? ? @conversion.count_conversions.to_i : 0,


но это как-то слишком громоздко для руби и боюсь что совсем не "DRY"

От гугла вот что нашел, но все равно ошибка выходит

#Conversion model

  after_initialize :default_values

  def default_values
    self.count_conversions ||= 0
  end

# или вот такое вставляю, тоже нету смысла

  def count_conversions
    read_attribute(:count_conversions) or 0
  end


Объясните новичку, пожалуйста, в чем я запутался, чего не могу понять и как можно красиво (а я почти уверен что это можно сделать) вынести значения по умолчанию в модель. Спасибо!
  • Вопрос задан
  • 295 просмотров
Решения вопроса 1
@thepry
Ruby on rails, 1С разработчик
От гугла вот что нашел, но все равно ошибка выходит

Да, потому, что если твой запрос не нашел ничего, то first вернет nil. А у объектов класса nil нужно тебе метода нет.
Выход может быть инициализация нового объекта:
@conversion = Conversion.joins(:track)
    .select('SUM(conversions.revenue) as sum_revenue, COUNT(*) as count_conversions')
    .group('tracks.campaign_id')
    .where(:tracks => { :campaign_id => campaign_id })
    .order('tracks.campaign_id ASC')
    .first

@conversion ||= Conversion.new


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

@count_conversions = @conversion.count_conversions if @conversion

UPDATE: Или так, если важно, чтобы всегда в @count_conversions было число
@count_conversions = @conversion.try(:count_conversions).to_i .
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@vsuhachev
@conversion.try(:count_conversions) || 0
Ответ написан
Freika
@Freika
Senior Ruby on Rails developer
conversions - это атрибут модели? Если да, то такое вещи прописываются в миграции, вида
t.string :conversions, default: 'some default value'
Ответ написан
Jeiwan
@Jeiwan
!@conversion.blank? ? @conversion.count_conversions.to_i : 0,
— в данном случае вполне себе решение, ничего плохого в нем нету. Repeat'а тут никакого нету.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы