我有两个模型用户和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;左
我无法弄明白。我是否需要使用其他关联类型才能使其正常工作?
感谢。
答案 0 :(得分:3)
rails中的标准has_many
:belongs_to
关系只允许每user
个hobby
。
这是因为关系是由user_id
表上的单个整数列(hobby
)定义的。 Rails指南中的以下图像说明了这种关系:
您最有可能寻找的是has_and_belongs_to_many
relationsship:
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
联接表中。