我有一个场景,我创建了一些has_many:通过我无法更新的关联。我很感激任何帮助。
这是我的设置:
以下是该方案:
关键字有一个基本的CRUD模型。创建一个行业然后添加关键字可以正常工作。
我与会议,行业和关键词的关系是我遇到问题的地方。我正在尝试更新会议信息,更改当前与之关联的行业,选择基于新行业的新关键字全部采用相同的形式。当我从混合中删除关键字元素时,更新有效。但当三者都在那里时,我就会得到错误。
我与行业和关键字的关系是:
class IKeywordable < ActiveRecord::Base
attr_accessible :industry_id, :keyword_id
belongs_to :industry
belongs_to :keyword
end
class CKeywordable < ActiveRecord::Base
attr_accessible :conference_id, :keyword_id
belongs_to :conference
belongs_to :keyword
end
以下是模特:
class Industry < ActiveRecord::Base
attr_accessible :name,
:conferences_attributes,
:i_keywordables_attributes,
:keywords,
:keywords_attributes,
:keyword_ids
validates :name, presence: true
validates :name, uniqueness: true
# Associations
has_many :conferences
accepts_nested_attributes_for :conferences
#Keywords
has_many :i_keywordables
has_many :keywords, through: :i_keywordables
accepts_nested_attributes_for :i_keywordables
accepts_nested_attributes_for :keywords
end
class Keyword < ActiveRecord::Base
attr_accessible
:name, :profile_id, :active, :rating,
:c_keywordables_attributes,
:i_keywordables_attributes,
:industries_atributes
# Associations
#Industries
has_many :i_keywordables
has_many :industries, through: :i_keywordables
accepts_nested_attributes_for :i_keywordables
#Conferences
has_many :c_keywordables
has_many :conferences, through: :c_keywordables
accepts_nested_attributes_for :c_keywordables
end
class Conference < ActiveRecord::Base
attr_accessible
:name, :address1, :address2, :city, :email,
:web, :profile_id, :state_id, :conference,
:description, :date_start, :date_end, :venue, :venue_web,
:organizer, :organizer_web, :c_keywordables_attributes,
:industry_attributes, :industry_id,
:industry, :keyword_ids
# Associations
belongs_to :state
belongs_to :industry
accepts_nested_attributes_for :industry
#Keywords
has_many :c_keywordables
has_many :keywords, through: :c_keywordables
accepts_nested_attributes_for :c_keywordables
serialize :keywords, Array
def to_s
state_id
end
end
这是Conference / edit.html.erb
<h2>edit <%= @conference.name %></h2>
<%= form_for @conference do |c| %>
<%= c.label :name %>
<%= c.text_field :name %>
<%= c.label :address1 %>
<%= c.text_field :address1 %>
<%= c.label :address2 %>
<%= c.text_field :address2 %>
<%= c.label :city %>
<%= c.text_field :city %>
<%= c.label :state_id%>
<%= c.collection_select :state_id, State.order(:name), :id, :name %>
<%= c.label :email %>
<%= c.text_field :email %>
<%= c.label :web %>
<%= c.text_field :web %>
<hr width="80%">
<%= c.label :industry_id %>
<%= c.collection_select :industry_id, Industry.order(:name), :id, :name %>
<br />
<%= c.fields_for :industry, @industry do |ci| %>
<%= ci.label :keyword_id %>
<%= ci.grouped_collection_select :keywords, Industry.order(:name),
:keywords,
:name,
:id,
:name,
{:include_blank => true}, { :multiple => true }
%>
<% end %>
<br />
<p><%= c.submit %></p>
<% end %>
以下是会议控制员:
def edit
@conference = Conference.find(params[:id])
end
def update
@conference = Conference.find(params[:id])
if @conference.update_attributes(params[:conference])
redirect_to action: "all", notice: 'conference was successfully updated.'
else
render action: "edit"
end
end
视图渲染正常但是当我提交更改时,我收到错误。我看到的错误是:
无法找到ID = 1 <= strong>
的会议ID = 3的行业以下是传递的参数:
{“utf8”=&gt;“✓”,“_ method”=&gt;“put”,“authenticity_token”=&gt;“k9fcAXF / iOXt3oVuTcxeDCaWOfE2PrVlBvFbQG8Mo / I =”,“conference”=&gt; {“ name“=&gt;”test conference“,”address1“=&gt;”address 1“,”address2“=&gt;”address 2“,”city“=&gt;”city“,”state_id“=&gt;”38 “,”email“=&gt;”test@example.com“,”网络“=&gt;”www.example.com“,”industry_id“=&gt;”1“,”industry_attributes“=&gt; {”关键字“ =&gt; [“”,“6”,“5”],“id”=&gt;“3”}},“commit”=&gt;“更新会议”,“行动”=&gt;“更新”,“ controller“=&gt;”meetings“,”id“=&gt;”1“}
答案 0 :(得分:0)
我认为问题是会议课程中以下两个陈述之间的冲突:
class Conference
...
has_many :keywords, through: :c_keywordables
...
serialize :keywords, Array do
...
end
end
对关键字的第一个引用是期望与关键字表建立ActiveRecord关联,而第二个引用期望一个db-backed属性(列)命名关键字,它将保存数组数据的序列化(yaml)表示。他们正在为如何帮助你而斗争,而你却是战斗中的失败者。
答案 1 :(得分:0)
has_many :c_keywordables
has_many :keywords, through: :c_keywordables
我可以直接拨打关键字。所以在控制台中,我可以做到:
> c = Conference.first
> c.keyword_ids
> []
> c.keyword_ids = [ 1, 2, 3 ]
=> [ 1, 2, 3 ]
所以我开始使用一个基本的复选框表单来尝试让事情发挥作用:
在Railscast的帮助下:
<% Keyword.all.each do |keyword| %>
<p>
<%= check_box_tag "conference[keyword_ids][]", keyword.id, @conference.keyword_ids.include?(keyword.id) %>
<%= keyword.name %>
</p>
<% end %>
它有效!现在我将回过头来尝试一些更复杂的形式,让它看起来像我想要的那样。
感谢所有帮助。我很感激!