我有一个名为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
其中:item
为Status
,Type
或Priority
old_states
和new_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
?
答案 0 :(得分:1)
使用polymorphic associations,这很容易。多态关联本质上允许您存储关系的id
以及它与之相关的内容。因此,在这种情况下,您可以说old_state
和new_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_state
和new_state
属于同一类型的模型。 Rails分别存储每个多态字段的模型,使old_state
成为Status
而new_state
是Type
。