Rails HABTM:仅限每位用户的Post.title唯一性

时间:2013-12-04 15:37:26

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

在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。{所以;

  • 作者#1可以使用Post.title&#39; My Post&#39;
  • 作者#2可以拥有Post.title&#39; My Post&#39;
  • 但是,作者#1无法创建标题为“我的帖子”的第二篇帖子

允许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

1 个答案:

答案 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时都会进行检查