在Rails 4中,我有一个典型的HABTM设置;
class Author < ActiveRecord::Base
has_and_belongs_to_many :posts
end
class Post < ActiveRecord::Base
has_and_belongs_to_many :authors
end
我想验证Post.title
的唯一性,但仅限Author
。{所以;
允许Post
有多个Author
,因此我无法使用belongs_to
并使用validates_uniqueness_of :title, scope: :author_id
而我不会确定如何最好地使用HABTM。
这可以使用validates
,还是需要callback
首先检查关联的Author
在保存之前是否匹配Post.title
?
修改
我使用以下迁移来设置连接表;
class CreateAuthorsPosts < ActiveRecord::Migration
def change
create_table :authors_posts, id: false, force: true do |t|
t.belongs_to :author, index: true
t.belongs_to :post, index: true
end
add_index :authors_posts, [:author_id, :post_id], unique: true
end
end
答案 0 :(得分:1)
我不相信你可以用预定义的验证器做你想做的事。
您可以定义使用自定义方法的验证(请参阅Active Record Validations documentation)
类似
class Post < ActiveRecord::Base
has_and_belongs_to_many :authors
validate :uniqueness_of_title_and_author
def uniqueness_of_title_and_author
if author.posts.where(title: self.title).exists?
errors.add(:title, "must be unique")
end
end
end
每次为#valid?
Post
时都会进行检查