Действие after_create в модели не обновляет атрибут родительской модели? - PullRequest
1 голос
/ 12 марта 2012

У меня есть Пост и Комментарий * модель 1004 *.

Я хочу добиться следующего: Каждый раз, когда сообщение создается или комментируется атрибут :content_changed_at атрибутасообщение должно обновляться с created_at:

class Post < ActiveRecord::Base
  attr_accessible :title, :content, :tag_names, :content_changed_at

  has_many :comments, :dependent => :destroy

  def init_sort_column
    self.content_changed_at = self.created_at || Time.now
  end
end

class Comment < ActiveRecord::Base
  attr_accessible :content, :user_id

  belongs_to :post, :counter_cache => true

  after_create :update_parent_sort_column

  private

  def update_parent_sort_column
    if self.post
      self.post.content_changed_at = self.created_at
    end
  end
end

content_changed_at обновляется при создании сообщения (с начальной датой created_at).Но по какой-то причине атрибут не обновляется, когда комментарий комментируется.

Вот как создается комментарий:

comments_controller.rb:

  def create
    @post = Post.find(params[:post_id])
    comment_attr = params[:comment].merge :user_id => current_user.id
    @comment = @post.comments.create(comment_attr)
    redirect_to post_path(@post)
  end

Сгенерированный SQL при создании сообщения:

#<Post id: 64, title: "tttttttttest", content: "hello", user_id: nil, created_at: "2012-03-12 10:07:29", updated_at: "2012-03-12 10:07:29", comments_count: 0, total_votes: 0, content_changed_at: "2012-03-12 10:07:29">

Пока все работает нормально: content_changed_at: "2012-03-12 10:07:29

Сгенерированный SQL при создании комментария к записи:

(0.2ms)  SAVEPOINT active_record_1
  SQL (1.5ms)  INSERT INTO "comments" ("content", "created_at", "post_id", "total_votes", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?)  [["content", "teststsetsetset"], ["created_at", Mon, 12 Mar 2012 10:10:09 UTC +00:00], ["post_id", 64], ["total_votes", 0], ["updated_at", Mon, 12 Mar 2012 10:10:09 UTC +00:00], ["user_id", nil]]
  Post Load (0.4ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" = 64 LIMIT 1
  SQL (0.4ms)  UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1 WHERE "posts"."id" = 64
   (0.2ms)  RELEASE SAVEPOINT active_record_1
 => #<Comment id: 51, content: "teststsetsetset", post_id: 64, user_id: nil, created_at: "2012-03-12 10:10:09", updated_at: "2012-03-12 10:10:09", total_votes: 0> 

сейчас, если я проверю сообщение еще раз:

content_changed_at: "2012-03-12 10:07:29

Дата та же.

Есть предложения, чтобы это исправить?

Ответы [ 3 ]

5 голосов
/ 12 марта 2012

В вашем методе update_parent_sort_column вы изменили content_changed_at сообщения, но на самом деле вы НЕ сохранили его.Попробуйте сделать это.

def update_parent_sort_column
    if self.post
      self.post.content_changed_at = self.created_at
      self.post.save
    end
  end

Или используйте метод update_attribute , чтобы изменить только один столбец сообщения.

1 голос
/ 12 марта 2012
  class Comment < ActiveRecord::Base
  ...

    def update_parent_sort_column
      if post
        self.post.content_changed_at = self.created_at
      end
    end
  end

в этом методе вы забыли self.post.save, чтобы применить изменения.

вы также можете попробовать update_column , если хотите пропустить обратные вызовы в модели Post.

class Comment < ActiveRecord::Base
  ...

  private
  def update_parent_sort_column
    if post
      self.post.update_column(:content_changed_at, self.created_at)
    end
  end
end
0 голосов
/ 04 мая 2012

Вы также можете попробовать следующее в своей модели комментариев:

class Comment < ActiveRecord::Base
attr_accessible :content, :user_id

belongs_to :post, :counter_cache => true, :touch => :content_changed_at
...

touch обновит content_changed_at соответствующего поля модели Post, когда Comment будет сохранено или уничтожено

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