0

我正在开发一个媒体库(模型 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

在我的循环中,我检查了数组项是否为空白,因为数组的第一个条目是空白的。我认为它与提示功能有关。无论如何,我的代码运行良好。我已经用另一个模型复制了它,并且可能会再做两个。下一个技巧是将其添加到我已经很复杂的搜索引擎逻辑中。

4

1 回答 1

0

因为我最初写了这个问题,所以我在 Rails 4 中重写了我的应用程序。我能够使用 has_many 开发一个解决方案,并用直接的 collection_select 语句替换我的 fields_for 语句。我最终回答了我自己的问题。下面链接上的答案详细说明了我最终是如何解决这个问题的。

Rails 4 - 使用 collection_select 获取具有嵌套属性的中间表的 id 数组

于 2013-11-13T22:21:44.367 回答