如何使用has_many:through关联来更新连接模型?

时间:2010-11-22 18:04:47

标签: ruby activerecord ruby-on-rails-3 has-many-through

我有一个关于多对多关系的问题,特别是has_many:通过关联。

我发现的所有教程都为您设置了模型和迁移,但是当涉及到控制器时,请不要犹豫不决。

我想要做的是在再次添加已经存在的文章时更新连接表的时间戳,以便它移动到“列表”的顶部。我该怎么做?

这就是我的创建操作:

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 Lee

感谢您的回答,因为我有一个has_many通过关联,我的文章模型看起来像这样:

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

所以我不知道是否可以向has_many添加:touch => true,因为我只想在连接表中输入特定条目。

如果用户添加过去已添加的文章,则创建操作中的更新点是将文章移至顶部(而不是再次添加)。

2 个答案:

答案 0 :(得分:3)

如果我理解正确,这不是控制器问题,而是模型问题。您可以在:touch => true关系中指定belongs_to。这将使得无论何时更新子项,关联的update_at都会更新。

所以在Article模型中添加这样的内容:

belongs_to :whatever, :touch => true

此外,与切向相关:从代码中确切地知道您的代码正在做什么,但似乎您可能将createupdate功能放在create中方法而不是适当地拆分它们。

答案 1 :(得分: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