我在编写一个组织科学论文的 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 分配给论文实例而不是新的引用实例。
将两张纸相互连接的最佳方法是什么?如何建立这些连接?
提前感谢您的帮助!