belongs_to和has_many关联问题

时间:2015-04-15 20:26:35

标签: ruby-on-rails ruby

我有两个模型用户和Hobbie模型。霍比已经有4项记录,如音乐,体育,书籍等。

然后我有表格可以创建用户,我可以从复选框中选择至少2个爱好。

User.rb

has_many: hobbies

Hobbie.rb

belongs_to :user

形式:

 <%= form_for(@user,  :remote=>"true",:html => {:id=>"new_user","data-parsley-validate" => true,:multipart => true}, remote: true ,format: :json) do |f| %>
               ...

         <% @hobbies.each do |hobbie| %>
              <li>

                <%= check_box_tag 'hobbie_ids[]',hobbie.id%> <%= h hobbie.name %>                       
              </li>        
                 <%= f.submit %>
         <% end %>
     <% end %>

当我创建具有音乐和体育等爱好的用户时,它可以毫无问题地保存。

t= User.last
t.hobbies => "music", "sports"

问题:当我选择第二位用户并选择体育和书籍等爱好并保存时。

然后在控制台中:

t.User.last
t.hobbies => "sports" and "books"

但对于第一个用户来说,只有&#34;音乐&#34;左

我无法弄明白。我是否需要使用其他关联类型才能使其正常工作?

感谢。

1 个答案:

答案 0 :(得分:3)

rails中的标准has_manybelongs_to关系只允许每userhobby

这是因为关系是由user_id表上的单个整数列(hobby)定义的。 Rails指南中的以下图像说明了这种关系:

has_many relationship illustration

您最有可能寻找的是has_and_belongs_to_many relationsship

Image from Rails Guides

class User < ActiveRecord::Base
  has_and_belongs_to_many :hobbies
end

class Hobby < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class CreateUsersAndHobbies < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.timestamps null: false
    end

    create_table :hobbies do |t|
      t.string :name
      t.timestamps null: false
    end

    create_table :users_hobbies, id: false do |t|
      t.belongs_to :user, index: true
      t.belongs_to :hobby, index: true
    end
  end
end

这里的关键区别在于,爱好和用户之间的关系存储在users_hobbies联接表中。