我正在开发一个媒体库(模型 MediaLibrary),我希望能够为每个项目分配多个主题。
我创建了一个模型 MediaTopic,它将包含媒体库项目的 id 和来自 Topic 模型的主题 id。
MediaLibrary 模型 has_many :media_topics。MediaTopic 模型属于_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
这是我最终在我看来使用的代码:
<%= 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
在我的循环中,我检查了数组项是否为空白,因为数组的第一个条目是空白的。我认为它与提示功能有关。无论如何,我的代码运行良好。我已经用另一个模型复制了它,并且可能会再做两个。下一个技巧是将其添加到我已经很复杂的搜索引擎逻辑中。