我在has_and_belongs_to_many
模型中创建新关系时遇到了一些麻烦。我这样定义模型:
journals model
has_and_belongs_to_many :posts
post model
has_and_belongs_to_many :journal
我不知道如何创建关联,我做了一个按钮,但我不知道它是如何工作的。我创建了动作add_post
def add_post
@journal_post = JournalsPosts.new
end
我创建了这个链接来创建关联,但我不知道现在该怎么做:
<%= link_to "Add to Journal",:controller => "journals",:action => "add_post" %>
重定向工作正确,但我不知道现在如何进行?你知道一些关于HABTM协会的指南吗?我已经试过了,但是没有用。
在我自己研究了这个之后,你应该能够做到
def add_post
j = Journal.first # or find_by, etc
p = Post.first # or find_by, etc
j.posts << p # creates a record in journals_posts table
j.save!
end
(1)被接受的答案使它听起来好像只能直接建立联系。此外,如果您使用的是习惯关联,则不会有"JournalsPosts"类,因为它特别避免了为中间表使用模型。
(2)注意这个关联不是唯一的。如果多次调用此方法,将在journals_posts表中获得具有相同的两个整数对的多个条目。
您应该高度考虑使用has_many, :through
,因为这是目前在Rails中处理这些类型关系的首选方式。
也就是说,如果您想继续使用has_and_belongs_to_many
,您需要以某种方式获得您想要关联的日志和帖子id,以便您可以正确地创建关联。
在你的路由:
resources :journals do
member do
put :add_post
end
end
在视图中(确保在某处设置了@journal
和@post
):
<%= link_to "Add to Journal", add_post_journal_path(@journal, :post_id => @post.id), :method => :put %>
在你的控制器中:
def add_post
@journals_posts = JournalsPosts.new(:journal_id => params[:id], :post_id => params[:post_id])
if @journals_posts.save
...
else
...
end
end