我有一个关于多对多关系的问题,特别是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
,因为我只想在连接表中输入特定条目。
如果用户添加过去已添加的文章,则创建操作中的更新点是将文章移至顶部(而不是再次添加)。
答案 0 :(得分:3)
如果我理解正确,这不是控制器问题,而是模型问题。您可以在:touch => true
关系中指定belongs_to
。这将使得无论何时更新子项,关联的update_at
都会更新。
所以在Article
模型中添加这样的内容:
belongs_to :whatever, :touch => true
此外,与切向相关:从代码中确切地知道您的代码正在做什么,但似乎您可能将create
和update
功能放在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