Rails ActiveRecord обновляет поля - PullRequest
0 голосов
/ 21 февраля 2010

Мой пример:

class Category < ActiveRecord::Base
  has_many :tags, :as => :tagable, :dependent => :destroy

  def tag_string
    str = ''
    tags.each_with_index do |t, i|
      str+= i > 0 ? ', ' : ''
      str+= t.tag
    end
    str
  end

  def tag_string=(str)
    tags.delete_all
    Tag.parse_string(str).each { |t| tags.build(:tag => t.strip) }
  end

end

Как бы вы оптимизировали это поле tag_string? Я не хочу удалять все теги каждый раз, когда хочу обновить их. Есть ли лучший способ разобрать строку с тегами? Я не хочу использовать плагин! Thx.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2010

Я знаю, что вы не хотите использовать плагин, но вы, возможно, захотите покопаться в источнике acts_as_taggable_on_steroids , чтобы увидеть, как они справляются с этими ситуациями. По моему опыту, работа с этим плагином была очень безболезненной.

1 голос
/ 22 февраля 2010

Я согласен с другими комментаторами. Вам лучше использовать плагин здесь. Вот одно из решений.

 class Category < ActiveRecord::Base
  has_many :tags, :as => :tagable, :dependent => :destroy

  def tag_string
    tags.collect(&:name).join(", ")
  end

  def tag_string=(str)
    # Next line will delete the old association and create
    # new(based on the passed str). 
    # If the Category is new, then save it after the call.
    tags = Tag.create(str.split(",").collect{ |name| {:name => name.strip} })
  end

end
1 голос
/ 21 февраля 2010
class Category < ActiveRecord::Base
  has_many :tags, :as => :tagable, :dependent => :destroy

  def tag_string
    tags.map {|t| t.name }.join ', '
  end

  def tag_string=(str)
    tags = Tag.parse_string(str)
  end

end

Я не знаю, что делает метод Tag.parse_string(str). Если он возвращает массив Tag объектов, то мой пример должен работать. И я не уверен, будет ли это только обновлять или удалять старые и добавлять новые. Вы можете проверить это и посмотреть в логах, что он действительно делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...