Ruby on rails 在数据库中有许多片面的唯一性

Ruby on rails 在数据库中有许多片面的唯一性,ruby-on-rails,has-many-through,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_

我有三个模型:

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

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

使用动态查找器
查找或创建方法

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
def创建
@feed=feed.find(参数[:feed\u id])
@关键字=关键字。按关键字查找或创建关键字(参数[:关键字])#我假设您的“关键字”表中有一列“关键字”

@feed.keywords据我所知,这方面的问题是,尽管您没有创建任何重复的关键字,但您也没有创建将关键字加入数据库中的提要所需的筛选器对象。除非这是“我从未尝试过的,但根据”,它应该创建联接模型。你试过了吗?虽然我做了两个小改动,但还是奏效了!谢谢。这是一个比我想象的更优雅的解决方案。这里是我必须改变的:
@feed.keywords你说得对,我已经用你的台词更新了我的答案<代码>包含
来自Java;-)
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