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 分配给论文实例而不是新的引用实例。

将两张纸相互连接的最佳方法是什么?如何建立这些连接?

提前感谢您的帮助!

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 回答