ActiveRecord Ассоциации О: Автосохранение и Self - PullRequest
0 голосов
/ 29 декабря 2010

Допустим, у меня есть два класса: Post и Comment

class Post < ActiveRecord::Base

  belongs_to :newest_comment, :class_name => "Comment", :foreign_key => "newest_comment_id", :dependent => :destroy
  has_many  :comments, :dependent => :destroy, :autosave => false

  def set_comment(new_comment)
    comments << new_comment              # <= still auto saves
    self.newest_comment = new_comment    # why do I need the self?
    save
  end

end

class Comment < ActiveRecord::Base

Атрибут: newest_comment - это небольшая оптимизация, которая доставляет мне трудности. Мне нужно, чтобы действия внутри set_comment происходили внутри транзакции.

Я прочитал документацию неправильно или new_comment не должен быть автосохранен. Мне также интересно, зачем нужен self.

Вы можете увидеть мои два комментария в коде.

1 Ответ

2 голосов
/ 29 декабря 2010

Вместо использования own_to, вы должны использовать #has_one, что аналогично #has_many, но с автоматическим ограничением 1, таким образом:

class Post < ActiveRecord::Base

  has_many :comments, :order => "created_at DESC"
  has_one :newest_comment, :class_name => "Comment", :order => "created_at DESC"

end

Таким образом, вам даже не понадобится гадать с автосохранением и тому подобным, поскольку последний комментарий всегда будет правильным. Если последний комментарий не относится к последнему #created_at, просто измените порядок по предложению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...