Автоматически игнорировать повторяющиеся экземпляры с одинаковым атрибутом (перед сохранением)? - PullRequest
1 голос
/ 03 марта 2012

У меня есть модель Tag только с одним атрибутом: :name.

tag.rb:

class Tag < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy  
  has_many :posts, :through => :taggings
  has_many :subscriptions
  has_many :subscribed_users, :source => :user, :through => :subscriptions
end

(itимеет many-to-many связь с Post модель):

class Post < ActiveRecord::Base
  attr_accessible :title, :content, :tag_names

  validates :title,   :presence => true,
                      :length   => { :maximum => 30 },
                      :uniqueness => true
  validates :content, :presence => true,
                      :uniqueness => true

  has_many :taggings, :dependent => :destroy
  has_many :tags, :through => :taggings

  attr_writer :tag_names
  after_save :assign_tags

  def tag_names
    @tag_names || tags.map(&:name).join(' ')
  end

  private

  def assign_tags
    if @tag_names
      self.tags = @tag_names.split(" ").map do |name|
        Tag.find_or_create_by_name(name)
      end
    end
  end
end

Как вы можете себе представить, я не хочу иметь 2 тега с одинаковым именем.Прямо сейчас, возможно создать их.Если есть такой тег: <Tag id=1, name=food>, а затем создается другой тег, подобный этому: <Tag id=2, name=food>.Я хочу, чтобы второе было проигнорировано, потому что уже есть тег с именем food.

(В значительной степени, как все системы тегов работают)

Есть какие-либо предложения для достижения этой цели?

1 Ответ

1 голос
/ 03 марта 2012

Я не уверен, полностью ли я понимаю вашу проблему, но, возможно, это поможет вам....

private

def assign_tags
  return if @tag_names.blank?
  @tag_names.split(" ").each do |name|
    tag = Tag.find_or_create_by_name(name)
    self.tags << tag unless tags.include?(tag)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...