ruby на рельсах перед сохранением обновите сначала другую таблицу

Я пытаюсь обновить другую связанную таблицу перед сохранением, но у меня возникают ошибки, с которыми я не знаком...

так что у меня в моей модели

post.rb

  before_save :update_total_items

  def update_total_items
    b = Tags.find(:tag_id => self.tag_id)
    b.total_items = b.total_items+1
    b.save
  end

но я получаю ошибку

Unknown key tag_id

так как я могу получить доступ к свойству, которое я добавляю, прежде чем сохранить его, чтобы использовать его и обновить существующее, связанное с другой таблицей?

2 ответа

Решение

Обычно id модели называется именно так. Вообще то, что вы хотите:

b = Tags.find(self.tag_id)

Учтите, что это может вызвать исключение ActiveRecord::RecordNotFound, если запись не найдена. Более безопасный подход:

if (b = Tags.where(:id => self.tag_id).first)
  b.increment!(:total_items)
end

Избегайте загрузки и сохранения, чтобы увеличить значение. Вы можете столкнуться с уродливым состоянием гонки, когда теряете счет.

Как примечание, очень нерегулярно, что ваша модель называется Tags, Это надо называть Tag,

Объект Post не имеет внешнего ключа tag_id, измените его на

  b = self.tags.find(:post_id => self.id)

Предполагается, что Post имеет has_many: теги, а Tag принадлежит_to:post

и я согласен с @tadman, что вы должны использовать метод приращения increment(attribute, by = 1)

Другие вопросы по тегам