Has_many through - односторонняя уникальность в базе данных - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть три модели:

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 = @feed.keywords.create(params[:keyword])


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

С этим кодом контроллера предыдущий пример приведет к дублированию ключевого слова в базе данных, по одному для каждого канала / фильтра.Есть ли прямое решение для этого, или мне нужно предварительно проверить, есть ли ключевое слово, и в этом случае просто создать фильтр?

1 Ответ

1 голос
/ 01 февраля 2012

Использование динамического поиска 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
...