我有三个型号:
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 /过滤器一个。是否有直接的解决方案,或者我是否需要事先检查是否已有关键字,在这种情况下只是创建过滤器?
答案 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