Ruby способ сделать сбой при сохранении базы данных - PullRequest
1 голос
/ 01 февраля 2012

Я новичок в Ruby и Ror, поэтому любое руководство было бы потрясающим. У меня есть функция:

def self.insert_feed_product_scores(id, low, high)
  avgScore = low.to_s + " - " + high.to_s
  @feedProduct = FeedProduct.find(id)
  @feedProduct.avg_score = avgScore
  @feedProduct.save
end

Если по какой-то причине идентификатор, который я передаю, не найден, я замечаю, что получаю эту ошибку, это нормально:

ActiveRecord::RecordNotFound: Couldn't find FeedProduct with id=999999

Я мог бы написать некоторую логику и проверить, есть ли оценка, и есть ли что-то найденное, прежде чем я сохраню, но это просто не похоже на Ruby, как делать вещи ... я должен просто написать в логике для проверки или Есть ли какой-нибудь Руби / Рор способ делать вещи?

Спасибо

Ответы [ 4 ]

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

Если вы хотите отслеживать сообщение об ошибке и правильно регистрироваться, следуйте ответу @lucapette. Else

def self.insert_feed_product_scores(id, low, high)
  @feedProduct = FeedProduct.find(id) rescue return false
  @feedProduct.avg_score = "#{low} - #{high}"
  @feedProduct.save
end
2 голосов
/ 01 февраля 2012
def self.insert_feed_product_scores(id, low, high)
  avgScore = low.to_s + " - " + high.to_s
  begin
    @feedProduct = FeedProduct.find(id)
    @feedProduct.avg_score = avgScore
    @feedProduct.save
  rescue ActiveRecord::RecordNotFound
    logger.info("Record not found: ", id)
  end
end

Это способ сделать это.Но разные способы решения таких ситуаций - дело вкуса ИМХО.

1 голос
/ 01 февраля 2012

Обычно я делаю это в таких ситуациях:

@feedProduct = FeedProduct.where(id: id).first
if @feedProduct
  @feedProduct.avg_score = avgScore
  @feedProduct.save
end

Это безопасно сохранит продукт.

0 голосов
/ 01 февраля 2012

Отправлять идентификаторы в метод класса не просто, я бы добавил метод к FeedProduct вместо:

class FeedProduct
  ...
  def set_scores(low, high)
    self.update_attribute(:avg_score, "#{low}-#{high}")
  end
  ...
end

Для использования таким образом:

FeedProduct.find(feed_product_id).set_scores(1, 10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...