我的Rails应用中有两个表:Category
和Service
。我还在它们之间创建了一个关联表CategoriesService
,除了验证CategoriesService
表上的id之外,一切正常 - 我只是注意到我能够创建一个与不存在的记录的关联。我想知道如何正确地修复它 - 我怀疑Rails应该让我们创建一些数据库级别的验证,这可能更快更干净。我这样定义了我的模型:
class Category < ApplicationRecord
has_and_belongs_to_many :services
end
class Service < ApplicationRecord
has_and_belongs_to_many :categories
end
class CategoriesService < ApplicationRecord
end
我当时认为创建has_and_belongs_to_many
关系会确保这种验证本身,但我可以看到我错了。我该怎么解决这个问题?
答案 0 :(得分:1)
首选
has_many :through
至has_and_belongs_to_many
。使用has_many :through
可以在连接模型上添加其他属性和验证。
在你的情况下:
class Category < ApplicationRecord
has_many :categories_services
has_many :services, through: :categories_services
end
class Service < ApplicationRecord
has_many :categories_services
has_many :categories, through: :categories_services
end
class CategoriesService < ApplicationRecord
belongs_to :category
belongs_to :service
# if not using Rails 5:
validates :category, presence: true
validates :service, presence: true
# if using Rails 5, a `belongs_to` will auto-validate the presence
end
使用连接模型(而不是has_and_belongs_to_many
),您可以更好地控制多对多关系:
created_at
和updated_at
字段,由Rails自动管理position
,然后您可以提供对特定services
的{{1}}进行排序的功能,{{1 } boolean column等。此外,您可以(我建议您这样做)通过在数据库中添加一些约束来强制执行此验证:
category