如何使用collection_select命令为多个值更新第二个模型?

时间:2013-01-29 22:14:30

标签: ruby-on-rails ruby ruby-on-rails-3.2

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

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

1 个答案:

答案 0 :(得分:0)

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

Rails 4 - Using collection_select to get an array of ids for an Intermediate Table with Nested Attributes