Has_many through - 数据库中的单面唯一性

时间:2012-02-01 18:57:57

标签: ruby-on-rails has-many-through

我有三个型号:

class Feed < ActiveRecord::Base
  has_many :filters, :dependent => :destroy
  has_many :keywords, :through => :filters, :uniq => true
end

class Filter < ActiveRecord::Base
  belongs_to :feed
  belongs_to :keyword

  validates_uniqueness_of :keyword_id, :scope => :feed_id
end

class Keyword < ActiveRecord::Base
  has_many :filters, :dependent => :destroy
  has_many :feeds, :through => :filters
end

我想要的是在数据库中只有关键字的唯一条目。例如,如果两个Feed都有一个关键字'hello',那么应该有两个过滤器(每个Feed一个)都指向同一个关键字。

我遇到的问题是控制器代码。也许我正在寻找一个太简单的解决方案,但我认为必须有一个简单的方法来做到这一点。这就是我到目前为止在创建操作中所拥有的:

def create
  @feed = Feed.find(params[:feed_id])
  @keyword = @feed.keywords.create(params[:keyword])


  redirect_to feed_keywords_path(@feed), notice: 'Keyword added successfully.' 
end

使用此控制器代码,前一个示例将在数据库中生成一个重复的关键字,每个Feed /过滤器一个。是否有直接的解决方案,或者我是否需要事先检查是否已有关键字,在这种情况下只是创建过滤器?

1 个答案:

答案 0 :(得分:1)

使用动态查找器find_or_create_by

def create
  @feed = Feed.find(params[:feed_id])
  @keyword = Keyword.find_or_create_by_keyword(params[:keyword]) # I assume here that you have a column 'keyword' in your 'keywords' table
  @feed.keywords << @keyword unless @feed.keywords.all.include?(@keyword)

  redirect_to feed_keywords_path(@feed), notice: 'Keyword added successfully.' 
end