如何在HABTM Rails Association中创建记录如何制作这个?

ove*_*uka 2 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

我在has_and_belongs_to_many模型中创建新关系时遇到了一些麻烦.我定义了这样的模型:

journals model

  has_and_belongs_to_many :posts

post model

  has_and_belongs_to_many :journal
Run Code Online (Sandbox Code Playgroud)

我不知道如何创建关联,我做了一个按钮,但我不知道它是如何工作的.我创造了这个动作add_post

  def add_post
    @journal_post = JournalsPosts.new
  end
Run Code Online (Sandbox Code Playgroud)

我建立这个链接来创建关联,但我不知道我现在要做什么:

<%= link_to "Add to Journal",:controller => "journals",:action => "add_post" %>
Run Code Online (Sandbox Code Playgroud)

重定向工作正常,但我不知道现在该怎么办?你知道HABTM协会的一些指南吗?我已经试过,但没有用.

shi*_*ity 12

在自己研究之后,你应该能够做到

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
Run Code Online (Sandbox Code Playgroud)

(1)接受的答案听起来似乎只能直接进行协会.如果您使用habtm关联,也不会有"JournalsPosts"类,因为它特别避免使用中间表的模型.

(2)请注意,此关联不是唯一的.如果你多次调用,你将在journals_posts表中获得具有相同两个整数对的多个条目.

  • 你不需要`j.save!` (6认同)

Jos*_*ken -3

您应该高度考虑使用,has_many, :through因为这是现在在 Rails 中建立此类关系的首选方式。

也就是说,如果您想继续has_and_belongs_to_many,您需要以某种方式获取您想要关联的期刊和帖子 ID,以便您可以正确创建关联。

在您的路线中:

resources :journals do
  member do
    put :add_post
  end
end
Run Code Online (Sandbox Code Playgroud)

在您看来(确保您在某处设置@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
Run Code Online (Sandbox Code Playgroud)

  • 我意识到OP有“JournalsPosts”,但该模型甚至不会存在,也不应该存在,因为有习惯关系。 (4认同)