3

結合モデルを使用していくつかの単語にリンクされたいくつかの概念を持つ辞書アプリケーションを構築しています。各概念を編集するためのフォームがあり、そこで単語を編集したり、新しい単語を追加したり、既存の単語を関連付けたりできます。

私は and を使用accepts_nested_attributes_forupdate_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
4

0 に答える 0