我有 2 个 ActiveRecord 对象:
位置
- 编号
- 名字
- clip_id
夹
- 编号
- 名字
- 我只列出了与此问题相关的属性)
目前clip belongs_to location
- 这按预期工作。
但是,我的项目现在需要Location
需要拥有 2 clips
。我想listing_clip
命名一个,我想命名description_clip
。我该怎么做?
在数据库中对此进行建模的最"正确"方法是在locations
表中具有一对外键,指向clips
表。为此,您可以反转关联,并向location
表添加listing_clip_id
和description_clip_id
。
然后,修改您的关联:
class Location < ActiveRecord::Base
belongs_to :listing_clip, class_name: 'Clip'
belongs_to :description_clip, class_name: 'Clip'
end
class Clip < ActiveRecord::Base
has_one :listed_location, class_name: 'Location', foreign_key: 'listing_clip_id'
has_one :described_location, class_name: 'Location', foreign_key: 'description_clip_id'
end
您可以向clips
表添加一个名为 clip_type
的附加列,并在Location
模型中引用您的关联,如下所示:
class Location < ActiveRecord::Base
has_one :listing_clip, class_name: 'Clip', conditions: { clip_type: 'listing' }
has_one :description_clip, class_name: 'Clip', conditions: { clip_type: 'description' }
end
class Clip < ActiveRecord::Base
belongs_to :location
end
如果 listing_clip
和 description_clip
之间的属性相同(除了该名称),并且您没有预见到未来的差异,您可以使用剪辑上名为 clip_type
的新列保持干燥:
class Location < ActiveRecord::Base
has_many :clips, limit: 2
end
class Clip < ActiveRecord::Base
attr_accessor :clip_type
belongs_to :location
end