Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails“有很多到”和不同的标记_Ruby On Rails_Ruby_Has Many Through - Fatal编程技术网

Ruby on rails Rails“有很多到”和不同的标记

Ruby on rails Rails“有很多到”和不同的标记,ruby-on-rails,ruby,has-many-through,Ruby On Rails,Ruby,Has Many Through,我有以下活动记录类。我正在尝试在不使用gem的情况下制作一个类似于twitter的标签。是否可以进一步优化保存标签和创建标签 class Opinion < ActiveRecord::Base belongs_to :user has_many :taggings has_many :tags, through: :taggings after_create :save_tags def self.tagged_with(name) Tag.fi

我有以下活动记录类。我正在尝试在不使用gem的情况下制作一个类似于twitter的标签。是否可以进一步优化
保存标签
创建标签

class Opinion < ActiveRecord::Base
  belongs_to :user      
  has_many :taggings
  has_many :tags, through: :taggings
  after_create :save_tags

  def self.tagged_with(name)
    Tag.find_by!(name: name).opinions
  end

  private

    def save_tags
      tags = create_tags      
      tags.each do |tag|
        t = tag.downcase
        oldTag = Tag.find_by(name: t)
        if oldTag
          tagging = Tagging.new(opinion: self, tag: oldTag)
          tagging.save
        else
          self.tags.create(name: t)
        end
      end
    end

    def create_tags
      tags = self.about.scan(/(\#{1}[a-zA-Z1-9]*\b)/).flatten
      if tags
        tags.uniq.reject! { |tag| tag.length < 2 }       
      end 
      return tags
    end
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :opinions, through: :taggings
  validates_uniqueness_of :name
end

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :opinion
end
类意见
此代码调用tags.count DB查询:

tags.each do |tag|
  t = tag.downcase
  oldTag = Tag.find_by(name: t)
  ...
end
您可以预加载它们:

old_tags = Tag.where(name: tags)