結合モデルを使用していくつかの単語にリンクされたいくつかの概念を持つ辞書アプリケーションを構築しています。各概念を編集するためのフォームがあり、そこで単語を編集したり、新しい単語を追加したり、既存の単語を関連付けたりできます。
私は and を使用accepts_nested_attributes_for
しupdate_attributes
ていますが、これは既に関連付けられている単語または新しく作成された単語でのみ機能します。以前に関連付けられていなかった既存の単語については、ActiveRecord::RecordNotFound (Couldn't find Word with ID=4 for Concept with ID=1000)
ActiveRecord が結合モデルで選択を実行すると、このようなエラーが発生します。
ここに私のモデルがあります:
class Word < ActiveRecord::Base
attr_accessible :notes, :text, :grammar_tag_list
has_many :semantic_relations, :dependent => :destroy
has_many :concepts, :through => :semantic_relations
end
class Concept < ActiveRecord::Base
attr_accessible :meaning_tag_list, :words_attributes
has_many :semantic_relations, :dependent => :destroy
has_many :words, :through=> :semantic_relations, :order => 'knowledge_id ASC'
accepts_nested_attributes_for :words, :reject_if => lambda { |w| w[:text].blank? }
end
class SemanticRelation < ActiveRecord::Base
belongs_to :word, :inverse_of => :semantic_relations
belongs_to :concept, :inverse_of => :semantic_relations
end
Concepts コントローラーで次のメソッドを使用して動作するように管理しました ( の前に呼び出しますupdate_attributes
) が、かなり汚いアプローチのようです。これを達成する適切な方法はありませんか?
def check_words
current_ids = @concept.word_ids
new_ids = params[:concept][:words_attributes].map do |w|
id = w[1][:id].to_i
unless id == 0
unless current_ids.include? id
id
end
end
end
@concept.word_ids = current_ids + new_ids unless new_ids.blank?
end