在两个模型

时间:2015-06-01 19:14:36

标签: ruby-on-rails ruby model

我有一个名为changes的模型,我将其定义为

create_table :ticket_changes do |t|
  t.string :item
  t.belongs_to :old_state
  t.belongs_to :new_state
  t.timestamps null: false
end

其中:itemStatusTypePriority old_statesnew_states将成为item字段中所列表格的记录ID。

在构建模型changes.rb时,我通常会写一行

    belongs_to :old_state, :class_name => 'TABLENAME'
    belongs_to :new_state, :class_name => 'TABLENAME'

但问题是表名总是会改变。任何建议,所以我可以调用status.name @change.old_state.name,它知道查看状态表,因为该记录的项目(@change)是Status

1 个答案:

答案 0 :(得分:1)

使用polymorphic associations,这很容易。多态关联本质上允许您存储关系的id以及它与之相关的内容。因此,在这种情况下,您可以说old_statenew_state可能属于其他各种模型。

您的代码将如下所示:

# migration
create_table :ticket_changes do |t|
  t.references :old_state, polymorphic: true
  t.references :new_state, polymorphic: true
  t.string :item
  t.timestamps null: false
end
# TicketChanges class
class TicketChange < ActiveRecord::Base
  belongs_to :old_state, polymorphic: true
  belongs_to :new_state, polymorphic: true
end

#Status
class Status < ActiveRecord::Base
  has_many :ticket_changes, as: :old_state
  has_many :ticket_changes, as: :new_state
end

# Type
class Type < ActiveRecord::Base
  has_many :ticket_changes, as: :old_state
  has_many :ticket_changes, as: :new_state
end

# Priority
class Priority < ActiveRecord::Base
  has_many :ticket_changes, as: :old_state
  has_many :ticket_changes, as: :new_state
end

Rails基本上会按照您的计划完成,但它会为您想要使用t.item的内容创建自己的字段。

请注意,您可能需要自定义验证,以确保old_statenew_state属于同一类型的模型。 Rails分别存储每个多态字段的模型,使old_state成为Statusnew_stateType