1

科学論文を整理する Rails アプリを作成するのに苦労しています。

各論文には多くの参照がある (他の論文) → ある論文は多くの論文を引用している 各論文には多くの引用がある (他の論文、反比例の関係) → 多くの論文に引用されている

私の意図は、このような論文の参照と引用にアクセスできるようにすることです

@paper = Paper.first
@paper.references => [Papers that @paper is citing]
@paper.citations  => [Papers that @paper is being cited by]

私が取った手順は次のとおりです。

# console
rails g model paper title  # Generate Paper model
rails g model citation paper_id:integer reference_id:integer  # Generate Citation Model

# app/models/paper.rb
class Paper < ActiveRecord::Base
  # Relations
  has_many :reference_relations, class_name: 'Citation'
  has_many :citation_relations, class_name: 'Citation', foreign_key: 'reference_id'

  # References and citations
  has_many :references, through: :reference_relations
  has_many :citations, through: :citation_relations, source: :paper

  attr_accessible :title
end

# app/models/citation.rb
class Citation < ActiveRecord::Base
  belongs_to :paper                           # Source of the reference, paper that is citing
  belongs_to :reference, class_name: 'Paper'  # Paper that is being referenced and cited

  # attr_accessible :reference_id # This should not be accessible, should it?
end

今、私は参照を構築しようとしています:

p = Paper.first
r = Paper.last
p.references.build(reference_id: r.id)

ただし、引用を作成しようとすると、ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: reference_idエラーが発生します。私は最初、Citation モデルの attr_accessible を設定する必要があると想定していましたが、ActiveRecord は reference_id を新しい引用インスタンスではなく紙のインスタンスに割り当てようとしていることが判明しました。

2 つの紙を互いに接続する最良の方法は何ですか?また、これらの接続を構築するにはどうすればよいですか?

事前にご協力いただきありがとうございます。

4

1 に答える 1

1

接続は論文自体ではなく引用によるものであるため、自己言及的ではないと思います。

したがって、私は次のようにアプローチします。

Paper 
has_many :citation_papers
has_many :citations, :through => citation_papers

Citation
has_many :citation_papers
has_many :papers, :through citation_papers

CitationPaper # Needs the two ID's
belongs_to :paper
belongs_to :citation
于 2012-09-08T12:34:23.610 に答える