Коварное поведение ActiveRecord?

У меня есть класс Post с методом vote, который создает экземпляр Vote

Это не работает

def vote(options)
   vote = self.votes.create(options)
   return vote if vote.valid?
   nil
end 

Это действительно работает

def vote(options)
   options[:post] = self
   vote = self.votes.create(options)
   return vote if vote.valid?
   nil
end 

Разве вызов .create не должен автоматически добавлять связь: post?

РАЗЪЯСНЕНИЕ

class Post ‹ActiveRecord :: Base has_many: конец голосов

class Vote ‹ActiveRecord :: База принадлежит_to: пользователю,: counter_cache => true принадлежит_to: конец сообщения


person Alexandre    schedule 26.10.2009    source источник
comment
Как это не работает? Требуются дополнительные пояснения.   -  person Ryan Bigg    schedule 26.10.2009


Ответы (2)


У тебя есть

has_many :votes

заявлена ​​в вашем Посте модель?

В какой момент вы вызываете метод голосования в жизненном цикле объекта? Это часть метода обратного вызова?

person bensie    schedule 26.10.2009
comment
Я вызываю метод голосования после того, как объект был создан (и сохранен). Вызов метода голосования не является частью обратного вызова. - person Alexandre; 27.10.2009
comment
Если бы у него не было has_many: голосов, чем self.votes.create, в обоих случаях вызвала бы ошибку. - person EmFi; 27.10.2009
comment
@Alexandre Если вы вызываете голосование после того, как объект был создан, почему он создает новый? - person EmFi; 27.10.2009
comment
@EmFi Извините, я не поняла ваш вопрос. Какой объект был создан при создании нового? - person Alexandre; 27.10.2009
comment
Это также может быть проще, если вы предоставите больше кода модели и команд, которые вы используете для тестирования в консоли. - person bensie; 27.10.2009

Было бы легче отлаживать, если бы вы написали его как self.votes.create!(options), потому что тогда он выдаст исключение с сообщением об ошибке. Вы можете убрать это, как только исправите проблему, но вы должны подумать о том, что ваш метод должен вернуть, если он не работает.

Имеет ли смысл Post#vote возвращать nil? Почему голосование должно быть неудачным? Как ваш код обрабатывает значение nil, возвращаемое Post#vote?

Может, тебе стоит просто переписать это как:

def vote(options)
  self.votes.create!(options)
end
person Luke Francl    schedule 26.10.2009
comment
Он вернет nil, если пользователь уже проголосовал, и в этом случае голос будет недействительным. - person Alexandre; 27.10.2009
comment
В ПОРЯДКЕ. Вы пробовали переключиться на создание! чтобы увидеть, в чем ошибка ActiveRecord? - person Luke Francl; 28.10.2009