我现在已经坚持了一天。我听说所有关于Rails的讨论能够处理这样简单的复杂性(虽然这不是/不应该很复杂)。
故事:用户可以拥有许多高级学位。我希望能够使用has_many through关系创建此关联,并在我的视图中使用复选框。
型号:
class User < ActiveRecord::Base
has_many :user_degree_lists
has_many :degrees, :through => :user_degree_lists, :source => :advanced_degree, :dependent => :destroy
end
class AdvancedDegree < ActiveRecord::Base
attr_accessible :value, :description
has_many :user_degree_lists
end
class UserDegreeList < ActiveRecord::Base
belongs_to :user
belongs_to :advanced_degree
end
ActiveRecord的:
class CreateUserDegreeLists < ActiveRecord::Migration
def self.up
create_table :user_degree_lists do |t|
t.integer :user_id
t.integer :advanced_degree_id
t.timestamps
end
add_index :user_degree_lists, :user_id
add_index :user_degree_lists, :advanced_degree_id
add_index :user_degree_lists, [:user_id, :advanced_degree_id], :unique => true
end
def self.down
drop_table :user_degree_lists
end
end
查看:
<%= form_for(@user, :html => {:autocomplete => 'off', :id => "sign_up_user" }) do |f| %>
...
<% for advanced_degree in AdvancedDegree.find(:all)%>
<%= check_box_tag "user[advanced_degree_ids][]", advanced_degree.id, @user.degrees.include? (advanced_degree.id) %>
<%= f.label :advanced_degrees, advanced_degree.description %>
...
<% end %>
提交表单后,将更新所有用户字段,但不会创建:user_degree_lists关系。
我在这里做错了什么?
答案 0 :(得分:0)
不确定你是否已经解决了这个问题,但我发现了一件事:用户类不应该'has_many:advanced_degrees'与'has_many:degrees'?可能想要在没有源代码的情况下尝试(除非你正在尝试多态的东西),这就是我做类似的事情。
答案 1 :(得分:0)
1)我将“UserDegreeList”重命名为“UserDegree”,因为这是一个连接表。
2)“AdvancedDegree.find(:all)”可以是“AdvancedDegree.all”。
3)我同意之前的评论,应将其重命名为“has_many:advanced_degrees”
4)要解决此问题,请尝试将此添加到用户:
accepts_nested_attributes_for :advanced_degrees, :allow_destroy => true, :reject_if => :all_blank
答案 2 :(得分:0)
您需要确保attr_accessible在复选框中设置了attr。
class Zone < ActiveRecord::Base
attr_accessible :name, :active, :user_ids
has_many :user_zones
has_many :users, :through => :user_zones
end
class User < ActiveRecord::Base
attr_accessible :name, :zone_ids
has_many :user_zones
has_many :zones, :through => :user_zones
end