2010-11-22 9 views
2

多対多関係、特にhas_many:through associationsに関する質問があります。has_many:throughアソシエーションを使用して結合モデルを更新するにはどうすればよいですか?

私が見つけたすべてのチュートリアルでは、モデルとマイグレーションを設定しましたが、コントローラに関しては吊り下げています。

私がしたいのは、すでに存在するアーティクルが再び追加されたときにジョインテーブルのタイムスタンプを更新して、それが "リスト"の先頭に移動するようにすることです。それ、どうやったら出来るの?事前に

def create 
    @article = Article.find_or_create_by_url(params[:article]) 
    if current_user.articles.find(@article) 

     # update the timestamps on the join table 
     # ie moved the old article to the top 

     flash[:notice] = "Successfully added article (again)." 
     redirect_to @article 
    else 
    @article.users << current_user 
    if @article.save 
     flash[:notice] = "Successfully added article." 
     redirect_to @article 
    else 
     render :action => 'new' 
    end 
    end 
end 

ありがとう:

これはどのように見えるかのアクションを作成する私です!

更新:

@Benリーあなたの答えのための

おかげで、私は協会を通じてhas_manyのを持っているように私の記事のモデルは次のようになります。

has_many :readinglist_items, :dependent => :destroy 
has_many :users, :through => :readinglist_items 

だから私はしないでください私がちょうど結合テーブルの特定のエントリにしたいので、:touch => trueをhas_manyに追加できるかどうかを知ってください。

作成アクションの更新のポイントは、ユーザーが過去に追加した記事をユーザーが追加した場合に記事を上に移動することです(もう一度追加するのではなく)。

答えて

1

私はそれを解決しました! (readinglist_itemは結合テーブルの名前です)。

def create 
    @article = Article.find_or_create_by_url(params[:article]) 
    if current_user.articles.find(@article) 

     @article.readinglist_items.find_by_user_id(current_user.id).touch 

     flash[:notice] = "Successfully added article (again)." 
     redirect_to @article 
    else 
    @article.users << current_user 
    if @article.save 
     flash[:notice] = "Successfully added article." 
     redirect_to @article 
    else 
     render :action => 'new' 
    end 
    end 
end 
+0

readinglist_itemsレコードの.touchは、結合表が通常のcreate_table型として設定されているため、主キーであるid列を持つ場合にのみ機能します。 create_join_tableを使用して結合を設定すると、主キーがなくなり、そのレコードに触れることができなくなります。答えは、主キーに追加のマイグレーションを追加することです。 add_column:readinglist_items、:id、:primary_key、first:true – IrishDubGuy

3

あなたが正しく理解している場合、これはコントローラの問題ではなく、モデルの問題です。 belongs_toの関係に:touch => trueを指定することができます。これにより、子供が更新されるたびに協会のupdate_atがよく更新されるようになります。それはあなたのコードがやっている正確にどのようなコードからも明らかではないが、それは多分あなたはcreateupdateを入れているように思える。また

belongs_to :whatever, :touch => true 

、接線方向の関連:

は、だからあなたArticleモデルではこのような何かを置きます機能を両方とも適切に分割するのではなく、createメソッドで実行します。

+0

コメントの書式が正しくないため、私の質問に答えました。 – Alfred