我正在尝试使用activerecord-import,但我似乎无法让我的应用程序识别它的存在.
我明白了
undefined method `supports_import?' for #<Class:...>
Run Code Online (Sandbox Code Playgroud)
要么
undefined method `import' for #<Class:...>
Run Code Online (Sandbox Code Playgroud)
不管我做什么.我一直在谷歌搜索这几天,并尝试我能想到的一切
当我们使用rails 2.3.5和ar-extensions时,它工作正常,但自从升级到rails 3.2后,它已被破坏.
每个人都说解决方案是使用activerecord-import,但我似乎不知道如何做到这一点.我已经安装了gem - 我相信我的ActiveRecord版本的正确版本 - 我已经在我的代码中需要它,但是我必须要做一些其他事情.
我在我的Gemfile中有这个:
gem 'activerecord-import', "~> 0.3.0"
Run Code Online (Sandbox Code Playgroud)
这在我的代码中:
require 'activerecord-import'
Run Code Online (Sandbox Code Playgroud)
这是我的宝石清单:
$ gem list
*** LOCAL GEMS ***
actionmailer (3.2.13)
actionpack (3.2.13)
active_utils (2.0.0, 1.0.5)
activemerchant (1.38.1, 1.37.0, 1.34.1)
activemodel (3.2.13)
activerecord (3.2.13)
activerecord-import (0.3.1)
activeresource (3.2.13)
activesupport (3.2.13)
acts_as_tree (1.1.0)
arel (3.0.2)
builder (3.0.4)
bundler (1.2.1)
capistrano (2.15.5)
ckeditor (4.0.6)
climate_control (0.0.3)
cocaine (0.5.1)
coffee-rails (3.2.2)
coffee-script (2.2.0)
coffee-script-source …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用activerecord-import gem,我已经按照维基上的指示来开球了,但我得到了一个NoMethodError: undefined method 'import' for #<Class:0x8b009b0>
.这是我的代码(基本上与wiki中的示例相同)
class ExampleCode
def self.testing
orders = []
10.times do |i|
orders << Order.new(:raw_data => "order #{i}")
end
Order.import orders
end
end
Run Code Online (Sandbox Code Playgroud)
我这样称呼方法:
ExampleCode.testing
Run Code Online (Sandbox Code Playgroud)
我试过windows,linux,带有sqlite数据库,一个mysql数据库,但仍然没有运气.而且我确定我安装了宝石:
actionmailer (3.2.6, 3.2.3, 3.2.1, 3.2.0)
actionpack (3.2.6, 3.2.3, 3.2.1, 3.2.0)
activemodel (3.2.6, 3.2.3, 3.2.1, 3.2.0)
activerecord (3.2.6, 3.2.3, 3.2.1, 3.2.0)
activerecord-import (0.2.10)
activerecord-oracle_enhanced-adapter (1.4.1)
activerecord-sqlserver-adapter (3.2.1)....
Run Code Online (Sandbox Code Playgroud)
我甚至尝试使用require(安装宝石时不应该这样做.我没有看到它出现在任何其他地方所以我担心我必须错过一些非常明显的东西
Rails版本: 4.2.7
Ruby版本: 2.3.3
我正在运行rake任务,将数百万个对象从CSV和JSON文件格式迁移到我的postgres数据库中.
我试图利用activerecord-import
加速将对象写入数据库.
尽可能简化代码,前半部分处理对象类型1(来自一种数据类型),后半部分处理对象类型2.
第一个对象类型迭代如此(为问题简化):
importing_object_one_array = []
my_external_data.each do |element|
new_element = ObjectOne.new(
title: element[0],
body: element[1]
)
importing_object_one_array << new_element
end
ObjectOne.import importing_object_one_array, validate: false
Run Code Online (Sandbox Code Playgroud)
这个大约有250,000个对象运行,写的没有任何问题,我在控制台中进行了检查,并成功编写了对象.
但是,对象类型2具有相当多的额外对象,每个对象的大小和设计大致与对象类型1相同.
其中大约有4,040,000个.
我应该等多久ObjectTwo.import
才能跑?我们现在已经好几个小时了.
或者,从调试的角度来看(因为我真的不想重新运行这个rake任务,除非我绝对不得不这样做),有什么脚本或策略可以看看当前是否ObjectTwo.import
真的在运行(即使它正在运行)或者任务挂?
我检查了rails控制台,我们看起来仍然ObjectTwo
和以前一样在数据库中.
我唯一的另一个想法是,因为我没有在运行之前打印到控制台#import
(例如puts "Now starting import!"
),我没有100%证明阵列中构建的对象已经完成.
我正在使用activerecord-import gem在单个查询中导入多个 ActiveRecord 文档。然后我使用保存的文档 ID 初始化相关关联并导入它们,依此类推。
但是,对于所有保存的文档,我需要有带有事件的PaperTrail gem版本create
。
有没有一些直接的方法来初始化它们,以便可以执行批量插入?
注意:AR-Import gem 忽略所有回调,因此我在导入后手动处理它们。
谢谢!
UPD-20/05/17:
目前我已经用补丁解决了这个问题PaperTrail::Model
。这是我的.../initializers/paper_trail.rb
:
module PaperTrail
class Version < ActiveRecord::Base
...
end
module ModelPatch
extend ActiveSupport::Concern
included do
# new method added to PaperTrail::Model module to make possible initialize
# `create` versions right after importing resources.
# This method contains modified code from private PaperTrail::Model::InstanceMethods#record_create
# Difference:
# - instead of `create!` we use `new` but with validation …
Run Code Online (Sandbox Code Playgroud) bulkinsert ruby-on-rails paper-trail-gem activerecord-import
我正在尝试使用 activerecord 导入进行导入。我收到无效参数错误我该如何解决这个问题?
谢谢
我在 postgresql 中的表架构:
create_table "vehicle_locations", force: :cascade do |t|
t.string "plate"
t.datetime "timestamp"
t.float "latitude"
t.float "longitude"
t.integer "speed"
t.integer "mileage"
t.boolean "ignition_on"
t.string "address"
end
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下代码导入:
values = [{"plate":"xxx","timestamp":"2017-11-28
20:42:57","latitude":41.9322,"longitude":27.3253,"speed":0,"mileage":1984
04,"ignition_on":true,"address":"address"},{"plate":"xxx","timestamp":"2017-11-28 20:43:46","latitude":47.0148,"longitude":39.1805,"speed":16,"mileage":209726,"ignition_on":true,"address":"address"}]
columns = [:plate, :timestamp, :latitude, :longitude, :speed, :mileage, :ignition_on, :address ]
VehicleLocation.import columns, values
Run Code Online (Sandbox Code Playgroud)
我正在使用 postgresql、rails 5.1。
提前致谢。
2017-11-28T17:45:08.844Z 17976 TID-gn4tnwlkc WARN: ArgumentError: Invalid arguments!
2017-11-28T17:45:08.844Z 17976 TID-gn4tnwlkc WARN: /home/kayayan/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-import-0.21.0/lib/activerecord-import/import.rb:508:in `import_helper'
/home/kayayan/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-import-0.21.0/lib/activerecord-import/import.rb:399:in `import'
/home/kayayan/Projects/RoR/trasportapp/app/workers/trio_worker.rb:23:in `perform'
/home/kayayan/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/sidekiq-5.0.5/lib/sidekiq/processor.rb:188:in `execute_job'
/home/kayayan/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/sidekiq-5.0.5/lib/sidekiq/processor.rb:170:in `block (2 levels) in process' …
Run Code Online (Sandbox Code Playgroud) 我正在尝试读取 5MM 行文件,但现在它超出了我在 heroku 上分配的内存使用量。我的方法有点快~200次插入/秒..我相信它在导入时崩溃了..所以我的计划是批量导入1,000或10,000个。我的问题是我如何知道我在文件的末尾,ruby 有一个.eof
方法,但它是一个File
方法,我不知道如何在我的循环中调用它
def self.import_parts_db(file)
time = Benchmark.measure do
Part.transaction do
parts_db = []
CSV.parse(File.read(file), headers: true) do |row|
row_hash = row.to_hash
part = Part.new(
part_num: row_hash["part_num"],
description: row_hash["description"],
manufacturer: row_hash["manufacturer"],
model: row_hash["model"],
cage_code: row_hash["cage_code"],
nsn: row_hash["nsn"]
)
parts_db << part
end
Part.import parts_db
end
end
puts time
end
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 activerecord-import 导入数据,但遇到了问题。如果该行已经存在,则需要更新它,否则需要创建它。表中的唯一行由两列的组合定义,其中每个列值在表中可能不是唯一的。由于这些列不是唯一的列,我将如何使用 on_duplicate_key_update 的conflict_target。
现在了解详细信息。我有一个名为 Order 的模型,下面是 Order 模型中列的简化版本。
id
order_number
sku_number
quantity
Run Code Online (Sandbox Code Playgroud)
数据库中的唯一行由 order_number 和 sku_number 的组合标识。id 列自动递增。通常,如果我有一个唯一的列作为标识符,我可以执行如下操作。因此,在下面的示例中,假设 id 列是唯一标识符,我将使用 id 列作为冲突目标。
order = Order.create(order_number: '1', sku_number: '1', quantity: 100)
order.quantity = 200
Order.import [order], on_duplicate_key_update: {conflict_target: [:id], columns: [:quantity]}
Run Code Online (Sandbox Code Playgroud)
这将更新数量,因为订单已经存在。
但我需要的是类似的东西
Order.import [order], on_duplicate_key_update: {conflict_target: [:order_number, :sku_number], columns: [:quantity]}
Run Code Online (Sandbox Code Playgroud)
其中 order_number 和 sku_number 将唯一标识冲突行。
但这会失败,因为 Postgres 期望冲突目标有一个唯一的列。
有没有办法使用非唯一列(即 order_number 和 sku_number)调用 on_duplicate_key_update ?
任何帮助将不胜感激。
我正在使用Active record Import gem将数据从 CSV 文件批量导入数据库。但我想在导入时跳过几个 CSV 列。
例如,我的 xaa.csv 有名称、作者、author_id、评级等标题。导入时,我想跳过“author_id”列值并导入所有其他列。
books = CSV.read("/public/xaa.csv") //What more should I do here to skip the 3rd column
columns = [:name, :author, :rating]
Book.import columns, books, :validate => false
Run Code Online (Sandbox Code Playgroud)