我正在开发一个媒体库(模型MediaLibrary),我希望能够为每个项目分配多个主题。
我创建了一个模型MediaTopic,它将包含媒体库项目的ID和主题模型中的主题ID。
MediaLibrary模型has_many:media_topics。 MediaTopic模型belongs_to:media_library。
这是我的collection_select语句。
<%= f.label :topic, "Main Topic" %><%= collection_select(:media_library, :topic_id, Topic.order('name'), :id, :name, {prompt: true}, {multiple: true}) %>
我目前在MediaLibrary模型中有:topic_id。我有一个明显的错误,它试图将一个id数组写入一个整数值。我想保留当前命令而不使用 multiple:true 参数,并添加一个新命令,将:topic_id添加到可以容纳多个值的东西,然后创建MediaTopic行。当我在上面的collection_select语句中更改:topic_id时,我得到一个未定义的方法错误。我的目标是在删除列之前使新逻辑工作。
如何捕获上述collection_select语句正在创建的数组?一旦我搞清楚,我就可以遍历数组并构建我的MediaTopic行。我想过可能使用fields_for。然而,在看到我已经有一个collection_select正在创建的数组之后,我想只访问该数组并循环遍历它。
我已经在Stack Overflow上看到了针对更困难情况的几种解决方案。我试过将它们拼凑在一起,但无济于事。我希望因为我知道我正在创建一个ID数组,不知何故我可以将它们分配给collection_select语句中的某些内容。
任何帮助将不胜感激。如果有人给我答案,我显然会遗漏一些我可能会尖叫的话。我现在还没有看到它。
更新2/18/2013 7:10 am
以下是我在视图中使用的代码:
<%= fields_for :media_topics do |media_topic| %>
<%= media_topic.label :topic, "Topics" %><%= media_topic.collection_select(:topic_id, Topic.order('name'), :id, :name, {}, {multiple: true}) %>
<% end %>
这是我最终在我的控制器(创建)中使用的代码:
@media_library = MediaLibrary.new(params[:media_library])
@media_topics = params[:media_topics]
if @media_library.save
if @media_topics
@topic_ids = @media_topics["topic_id"]
@topic_ids.each do |topic|
if topic.blank?
else
@media_topic = MediaTopic.new
@media_topic.media_library_id = @media_library.id
@media_topic.topic_id = topic.to_i
@media_topic.save
end
end
end
end
以下是我最终在控制器中使用的代码(更新):
@media_library = MediaLibrary.update_attributes(params[:media_library])
@media_topics = params[:media_topics]
if @media_library.save
if @media_topics
MediaTopic.where("media_library_id = ?", params[:id]).destroy_all
@topic_ids = @media_topics["topic_id"]
@topic_ids.each do |topic|
if topic.blank?
else
@media_topic = MediaTopic.new
@media_topic.media_library_id = @media_library.id
@media_topic.topic_id = topic.to_i
@media_topic.save
end
end
end
end
在我的循环中,我检查了数组项是否为空,因为数组的第一个条目是空白的。我认为它与提示功能有关。无论如何我的代码运行良好。我已经将它与另一个模型重复了,并且可能会再做两次。接下来的技巧是将其添加到我已经很复杂的搜索引擎逻辑中。
答案 0 :(得分:0)
由于我最初写这个问题,我在Rails 4中重写了我的应用程序。我能够使用has_many开发一个解决方案,并用直接的collection_select语句替换我的fields_for语句。我最后回答了自己的问题。以下链接的答案详述了我最终如何解决这个问题。