rails中的自我关联以跟踪相关记录

时间:2016-11-12 10:04:51

标签: ruby-on-rails ruby associations rails-admin

我有一个名为 Letter 的模型和另一个名为 LetterTracking 的模型:

class Letter < ApplicationRecord
  has_many :letter_trackings, as: :trackable
end

class LetterTracking < ApplicationRecord
    belongs_to :letter
    has_many :letter_trackings, as: :trackable 
end

这是我用于字母跟踪的创建表格迁移:

class CreateLetterTrackings < ActiveRecord::Migration[5.0]
  def change
    create_table :letter_trackings do |t|
      t.integer  :trackable_id, default: 0, null: false, unique: true
      t.string   :trackable_type
      t.text     :paraph
      t.string   :status
      t.string   :assignee
      t.belongs_to :letter
      t.timestamps
    end
  end
end

正如您在下面的屏幕截图中看到的那样,当我为第二次跟踪选择跟踪记录时,关系是正常的,但是当我添加第三个字母跟踪时,第二个关系将删除,最后一个保持关联。 我想要的是保持每个记录中的字母跟踪而不是最后一个。我的意思是嵌套记录,我可以保留相关记录。 任何的想法 ? 谢谢 enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

首先,作为第二个想法,多态关系在这种情况下保持跟踪似乎毫无用处。这里最合适的东西是基于树的关系我想。 这是我的 LetterTracking.rb

class LetterTracking < ApplicationRecord
    belongs_to :letter
    has_many :children, class_name: "LetterTracking", foreign_key: "parent_id"                             
    belongs_to :parent, class_name: "LetterTracking"
end

这是我的 letter.rb

class Letter < ApplicationRecord
    has_many :letter_trackings
end

最终 LetterTrackings Migration

class CreateLetterTrackings < ActiveRecord::Migration[5.0]
  def change
    create_table :letter_trackings do |t|
      t.references :parent, index: true
      t.text     :paraph
      t.string   :status
      t.string   :assignee
      t.belongs_to :letter, index: true
      t.timestamps
    end
  end
end

现在,我可以将lettertrackings的记录像树一样连接在一起,同时在每个记录中保留字母ID!是的:)