Вот что я пытаюсь сделать:
- У меня есть система тегов.
- Теги создаются при создании сообщений (posts has_many: tags,: through =>: tag_joins.
- Соединение тегов создается автоматически при создании сообщения с тегами).
Я хочу проверить, существует ли тег уже. Если это так, я хочу использовать существующий тег для записи tag_join, а не создавать новую запись тега.
Вот мой текущий код, который не работает.
class Tag < ActiveRecord :: Base
belongs_to :user
belongs_to :tag_join
belongs_to :post
before_create :check_exists
def check_exists
tag = Tag.where(:name => self.name, :user_id => current_user.id)
if tag.nil?
tag = Tag.create(:name => self.name, :user_id => current_user.id)
end
end
end
Хотя это не работает, я получаю сообщение об ошибке при создании задачи ... (на самом деле сервер просто перестал работать - я не получаю конкретной ошибки).
Есть идеи?
Токланд сказал, что я создаю бесконечный цикл, сказав ему снова создать тег - поэтому я попробовал это:
def check_exists
tag = Tag.find_by_name_and_user_id(:name => self.name, :user_id => current_user.id)
if tag != nil
self.id = tag.id
end
end
И все равно получите тайм-аут сервера
Редактировать: я не уверен, имеет ли это значение, но способ добавления тегов похож на "http://railscasts.com/episodes/73-complex-forms-part-1
они вложены в почтовую форму и используют что-то вроде этого:
def tag_attributes=(tag_attributes)
tag_attributes.each do |attributes|
tags.build(attributes)
end
end
Мне интересно, мешает ли это всей этой работе работать? Кроме того, использование current_user.id в модели определенно является проблемой ...
EDIT:
Что-то, что я понял:
это должно было измениться, формат, который мы использовали прежде, был неправильным синтаксисом - обычно используемый для метода .where.
def check_exists
@tag = Tag.find_by_name_and_user_id(self.name, self.user_id)
if @tag != nil
#return false
#self=@tag
end
end
Теперь проблема в том, что я могу узнать, существует ли тег уже. Но что тогда? Если я использую опцию return false, при создании поста возникает ошибка, а запись о соединении не создается ... Другая опция "self = @ tag", очевидно, просто не работает.