2011-04-06 88 views
0

我使用AR-扩展到进口大量对象数据库的同步不起作用,但synching他们DB回来只是不工作。使用AR-扩展进口:

MY代码:

posts = [Post.new(:name=>"kuku1"), Post.new(:name=>"kuku2"), ...] 
Post.import posts, :synchronize=>posts 

帖子被提交到数据库,并且每一个被分配有主键(ID)自动完成。但是当事后检查posts数组中的对象时,我发现它们没有id字段,并且new_record标志仍然为true。 我也尝试加入:reload => true,但这并没有帮助。

知道为什么同步不工作?

+0

验证失败吗?从控制台,尝试'post = Post.create(:name =>“kuku1”)'和'post.errors.full_messages'来查看是否以及哪些验证失败。 – Chirantan 2011-04-06 11:58:46

+0

我没有在模型中的任何验证,而且我试图关闭它们:validate => false。没有帮助:( – MikeMarsian 2011-04-06 12:10:27

回答

3

这现在是不可能的新记录。从ar-extensions 0.9.3开始,当同步新记录时,这不起作用,因为同步期望您正在同步的记录已经存在。它使用封面下的主键来确定要载入的内容(但是新记录的主键为零)。这个限制*也存在于activerecord-import 0.2.5中。如果你可以在其他条件下同步,我会很高兴发布一个允许传递条件的新gem。对于Rails 3.x,你需要使用activerecord-import(它取代了ar-extensions)。请在github上创建票据/问题:https://github.com/zdennis/activerecord-import/issues

对于Rails 2.x,您仍然希望使用ar-extensions,并且我可能会将activerecord-import更新回溯并推出新的gem。如果您想在这里喜欢这个功能,请在GitHub上创建票证/问题:https://github.com/zdennis/ar-extensions/

补丁亦欢迎。

* 这里的限制是数据库约束,因为它不可能在单次插入/导入之后获得所有新创建记录的ID,而不会执行像表锁定之类的奇怪事情,我认为这不是一个好的解决方案这个问题。如果任何人有想法,我全部耳朵。

UPDATE

ActiveRecord的进口0.2.6和AR-扩展0.9.4已经发布并且包括用于指定要同步上的字段支持。这些字段应该是唯一的。请参阅http://www.continuousthinking.com/2011/4/6/activerecord-import-0-2-6-and-ar-extensions-0-9-4

+0

扎克感谢名单为详细的答复。我的确可以在其他条件同步(对我来说,这是“post_guid”字段)。 我在函数内部_synchronize_接受关键参数的代码所看到的,所以似乎做的唯一一件事就是在关键领域的添加姓名到:同步参数 我使用Rails 2.3.8,所以如果你能反向移植此功能,这将是巨大的:) – MikeMarsian 2011-04-06 15:04:40

+0

迈克,我已经发布了宝石,并用信息更新了答案。 – 2011-04-06 18:59:02

+1

你的支持程度令人难以置信,我相当无语:) – MikeMarsian 2011-04-07 16:39:28