我正在构建一个字典应用程序,其中我使用连接模型将一些概念链接到某些单词。我有一个表单来编辑每个概念,我可以在其中编辑单词,为其添加新单词或将现有单词与其关联。
我正在使用accepts_nested_attributes_for
和update_attributes
,但这仅适用于已经关联的字词或新创建的字词。对于之前未关联的现有单词,当ActiveRecord在连接模型上运行select时,我会收到类似ActiveRecord::RecordNotFound (Couldn't find Word with ID=4 for Concept with ID=1000)
的错误。
以下是我的模特:
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