Как проверить наличие атрибутов на объекте и обновить отсутствующие? - PullRequest
0 голосов
/ 15 мая 2018

Итак, представьте, что у меня есть следующий код:

    stock = Stock.find_or_initialize_by(ticker: ticker)
    if stock.new_record?
      stock.assign_attributes(jse_link: link, name: name, price: price)
      stock.save!
      puts "#{stock.ticker} created successfully with price: #{stock.price}, name: #{stock.name} and can be viewed at #{stock.jse_link}."
    elsif stock.jse_link.empty? || stock.name.empty?
      stock.update!(jse_link: link, name: name, price: price)
      puts "#{stock.ticker} updated successfully with price: #{stock.price}, name: #{stock.name} and can be viewed at #{stock.jse_link}."
    elsif !stock.price.eql? price
      stock.update!(price: price)
      puts "#{stock.ticker} updated successfully with price: #{stock.price}."
    end

Как мне изменить код, приведенный выше, чтобы он был более СУХИМ и элегантным?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Возможно, вы захотите рассмотреть метод в вашей Stock модели, например:

def patch(price:, new_link:, new_name:)
  update(
    price: price,
    jse_link: (jse_link.presence || new_link),
    name: (name.presence || new_name)
  )
end

И используйте его в вашем контроллере следующим образом:

if stock.new_record?
  # ...
else
  stock.patch(new_link: link, new_name: name, price: price)
end
0 голосов
/ 15 мая 2018

Вы можете использовать проверки :

class Stock < ActiveRecord::Base
  validate :link_and_name, on: :validate_link_and_name

  def link_and_name
    if jse_link.empty? && name.empty?
      errors.add(:link_and_name_empty, 'need to provide link and name')
    end
  end
end

Затем в вашем контроллере:

stock.update(price: price)
unless stock.valid?(:validate_link_and_name)
  stock.update(jse_link: link, name: name)
end
...