Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.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 非常缓慢的迁移_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 非常缓慢的迁移

Ruby on rails 非常缓慢的迁移,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我的最新迁移运行得非常慢(600秒),尽管它做得不多 我有一个模型,其中包含字符串格式的标记,用逗号分隔,如下所示: Model.tags=“TAG1、TAG2、TAG3” 我想创建一个新的标记模型,该模型与我的模型有一个has_和_-belies_-to_-many关系 这里是迁移 def self.up rename_column :pizzas, :tags, :tags_migration create_table :tags do |t| t.string :name t.i

我的最新迁移运行得非常慢(600秒),尽管它做得不多

我有一个模型,其中包含字符串格式的标记,用逗号分隔,如下所示:

Model.tags=“TAG1、TAG2、TAG3”

我想创建一个新的标记模型,该模型与我的模型有一个has_和_-belies_-to_-many关系

这里是迁移

def self.up
rename_column :pizzas, :tags, :tags_migration

create_table :tags do |t|
  t.string :name
  t.integer :count
  t.timestamps
end

create_join_table :tags, :pizzas do |t|
  t.index [:tag_id, :pizza_id]
end

Pizza.all.each do |pizza|
  pizza_tags = pizza.tags_migration
  unless pizza_tags.empty?
    pizza_tags_array = pizza_tags.split(', ')
    pizza_tags_array.each do |tag|
      t = Tag.find_by(name: tag)
      if t.nil?
        t = Tag.new
        t.name = tag
        t.count = 1
      else
        t.count = t.count + 1
      end
      t.pizzas << pizza
      t.save
      pizza.tags << t
      pizza.save
    end
  end
  puts "pizza n" + pizza.id.to_s
end
end
def self.up
重命名列:pizzas,:tags,:tags\u迁移
创建|u表:标记do|t|
t、 字符串:名称
t、 整数:计数
t、 时间戳
结束
创建|join|table:tags,:pizzas do|t|
t、 索引[:tag\u id,:pizza\u id]
结束
披萨。所有人都做披萨|
pizza\u标记=pizza.tags\u迁移
除非比萨饼是空的?
pizza_tags_数组=pizza_tags.split(','))
比萨饼标签数组。每个do标签|
t=标记。查找方法(名称:标记)
如果t.nil?
t=Tag.new
t、 名称=标记
t、 计数=1
其他的
t、 计数=t.计数+1
结束

t、 pizzas看起来你可能在内存中保存了很多东西(因为
Pizza.all
)。一个简单的性能优势是将
Pizza.all.each
更改为
Pizza.find\u each

  • @codenamev关于
    find_each
  • 您在标记中有n+1个查询。查找方法(名称:标记)
  • 还有这里
  • -

    t.pizzas
    
    t.pizzas << pizza
    t.save
    pizza.tags << t
    pizza.save