一个 ActiveRecord 对象如何拥有其他对象的 2 个实例作为单独的属性



我有 2 个 ActiveRecord 对象:

位置

  • 编号
  • 名字
  • clip_id

  • 编号
  • 名字
(为了简洁起见

- 我只列出了与此问题相关的属性)

目前clip belongs_to location - 这按预期工作。

但是,我的项目现在需要Location需要拥有 2 clips。我想listing_clip命名一个,我想命名description_clip。我该怎么做?

在数据库中对此进行建模的最"正确"方法是在locations表中具有一对外键,指向clips表。为此,您可以反转关联,并向location表添加listing_clip_iddescription_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_clipdescription_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

最新更新