多者数マッピングで記事とその作成者の関係を示す3つのモデルArticle
,Author
、およびAuthorLine
があります。モデルを保存する前に追加のアソシエーション属性を更新する
class Article < ActiveRecord::Base
has_many :author_lines, :dependent => :destroy
has_many :authors, :through => :author_lines, :dependent => :destroy, :order => 'author_lines.position'
attr_accessor :author_list
end
class Author < ActiveRecord::Base
has_many :author_lines
has_many :articles, :through => :author_lines
end
class AuthorLine < ActiveRecord::Base
validates :author_id, :article_id, :position, :presence => true
belongs_to :author, :counter_cache => :articles_count
belongs_to :article
end
AuthorLine
モデルは、記事の著者の順序を指示する追加の属性position
を、持っています。ここで
は、私がarticle.rbに、与えられた著者名で記事を作成するためにやっているものです:
def author_list=(raw)
self.authors.clear
raw.split(',').map(&:strip).each_with_index do |e, i|
next if e.blank?
author = Author.find_or_create_by_name(e)
#1
self.authors << author
#2
# AuthorLine.create(:author_id => author.id, :article_id => self.id, :position => i)
end
end
問題は、私はAuthorLine
秒対応のposition
属性を更新する見当がつかないです。 1行目を削除して2行目のコメントを外すと、self.id
が指定されていない可能性があるため、作成されたAuthorLineにはが含まれている可能性があります。