各アイテムに複数のトピックを割り当てることができるメディア ライブラリ (モデル MediaLibrary) を開発しています。
メディア ライブラリ アイテムの ID と Topic モデルのトピック ID を含むモデル MediaTopic を作成しました。
MediaLibrary モデルには、多くの :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 ステートメントの何かに割り当てることができることを願っています。
どんな助けでも大歓迎です。誰かが私に答えをくれたら、おそらくDUHを叫ぶだろう何かが明らかに欠けています。現時点では見ていないだけです。
更新 2013 年 2 月 18 日午前 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
私のループでは、配列の最初のエントリが空白だったので、空白の配列項目をチェックしました。プロンプト機能と関係があると思います。とにかく、私のコードはうまく機能しています。私はそれを別のモデルで複製しましたが、おそらくこれをさらに2つ行うでしょう. 次のトリックは、これを既に複雑な検索エンジン ロジックに追加することです。