验证连接表中两个ID的唯一性

时间:2014-08-12 22:46:09

标签: mysql sql ruby-on-rails validation join

我有一个列表模型,其中包含has_and_belongs_to_many个帖子,反之亦然。

我有一个联接表:

create_table :postings_lists do |t|
  t.integer :posting_id
  t.integer :list_id
end 

用户有很多列表。 我已经通过以下方式验证了用户的列表唯一性:

validates :name, presence: true, uniqueness: {scope: :user_id}

在联接表中,如何验证:posting_id和:list_id的唯一性,以便发布不能多次属于某个列表?

我已经尝试在模型中添加了uniq:true和has_and_belongs_to_manys,但它混乱了,我尝试在列表模型中添加自定义验证,但它没有工作。

我认为最简单的方法就是验证联接表中的两个ID,但我不知道如果不创建模型就能做到这一点?

2 个答案:

答案 0 :(得分:0)

我会使用has_many:through而不是HABTM。

class List < ActiveRecord::Base
  has_many :postings
  has_many :posts, through: :postings
end

class Posting < ActiveRecord::Base
  belongs_to :list
  belongs_to :post

  validate :post_id, uniqueness: {scope: :list_id} 
end

class Post < ActiveRecord::Base
  has_many :postings
  has_many :lists, through: postings
end

答案 1 :(得分:0)

我最后添加 uniq:true

  • 解释

has_and_belongs_to_many:帖子, uniq:true

  • 刊登

has_and_belongs_to_many:列表, uniq:true

如果您使用像帖子这样的内容,这会导致一些问题,因为在对其执行“order_by”等其他操作之前,事情必须“不同”。

但您可以通过使用“map”等不同的查询来解决此问题。