如何为一个成员强制执行has_many_through关联?

时间:2013-12-16 22:09:44

标签: ruby-on-rails associations has-many-through has-and-belongs-to-many

我有以下型号:

class City < ActiveRecord::Base
  has_many :cities_regions_relationships
  has_many :regions, through: :cities_regions_relationships
end

class Region < ActiveRecord::Base
  has_many :cities_regions_relationships
  has_many :cities, through: :cities_regions_relationships
end

class CitiesRegionsRelationship < ActiveRecord::Base
  belongs_to :city
  belongs_to :region

  validates :city_id, presence: true
  validates :region_id, presence: true
end

我想要的是,如果没有与某个地区相关联的城市,就无法创建一个城市。但是,在尝试之前,我必须能够在尚未保存的城市上建立关系。

我在控制台中尝试了这个(已经创建了一个区域)

c = City.new(name: "Test")
c.cities_region_relationship.build(region_id: Region.first.id)
c.save

然而,这失败了,因为这个关系没有city_id(这是正常的,因为我还没有保存城市,它没有ID)。

我可以尝试其他方法,但我总会遇到同样的问题:如何在新对象上创建一个尚未保存在数据库中的关系?

如果您对我的初始问题有其他完全不同的解决方案(强制城市至少有一个区域),请不要犹豫,建议完全不同的东西。

1 个答案:

答案 0 :(得分:0)

您无需构建cities_region_relationship。通过将region_ids传递给新的City实例,这将为您创建cities_region_relationship

您可以在控制台中尝试:

c = City.new(name: "Test", region_ids: [an array of existing region ids])
c.save

对于验证,您可以定义一个新的验证方法,用于检查上面评论中SO帖子中提到的self.regions.blank?