2012-03-12 14 views
1

私は投稿コメントモデルです。モデルのafter_createアクションが親モデルの属性を更新していませんか?

私は次のことを達成したい:ポストを作成またはポストの: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 

日付は同じです。

これを修正するための提案はありますか?

+0

保存したり、削除され

class Comment < ActiveRecord::Base attr_accessible :content, :user_id belongs_to :post, :counter_cache => true, :touch => :content_changed_at ... 

touchは、関連するPostモデルフィールドのcontent_changed_atを更新します投稿を保存しない。コールバックで 'self.post.save'を2行目と呼ぶとどうなりますか? –

答えて

5

、あなたはポストの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列だけを変更できます。

1
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を試すこともできます。あなたのupdate_parent_sort_column方法で

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

笑...私たちは同じ答えを持っています! –

+0

@evfwcqcgダン、今私は何を答えてください:) – alexchenco

0

また、あなたのコメントのモデルで以下を試すことができます:Commentは、あなたが投稿の属性を更新するように見える

関連する問題