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)