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

时间:2013-01-19 17:26:48

标签: ruby-on-rails ruby 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

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

  def add_post
    @journal_post = JournalsPosts.new
  end

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

<%= link_to "Add to Journal",:controller => "journals",:action => "add_post" %>

重定向工作正常,但我不知道现在该怎么办?你知道HABTM协会的一些指南吗?我已经尝试了this,但没有帮助。

3 个答案:

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

(1)接受的答案听起来似乎只能直接进行关联。你也没有&#34; JournalsPosts&#34; class,如果您正在使用habtm关联,因为它特别避免使用中间表的模型。

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

答案 1 :(得分:0)

您应该高度考虑使用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

答案 2 :(得分:0)

我感谢,但是add_post将是一个页面,其中列出的文件供用户选择他要添加帖子的哪个报纸,我制作更多样本,因此:

控制器:

  def add_post
    @journal_post = JournalsPosts.new
    session[:post_add] = params[:id]
  end

   def add_post_complete
     @journal_post = JournalsPosts.create(:post_id => session[:post_add],:journal_id => params[:id])

     respond_with @journal_post
   end

add_post.html.erb

<h1>Escolha o Jornal que deseja adicionar:</h1>
 <ul>
<% current_user.journals.each do |journal| %>
        <li><%= link_to journal.name,add_post_complete_journal_path(journal),:remote=>true %> </li>
<%end%>
 </ul>

所以我在js中创建了add_post_complete并制作了这条路线:

  resources :journals do
   member do
     put :add_post
     get :add_post_complete
    end
  end

这很好,非常感谢帮助我非常非常重要地了解路线中的成员。

更重要的是,如果我想要exib一个灯箱,那么你应该知道我是如何制作这个,请非常非常感谢,多多了解你的回应。