Ruby on rails RubyonRails中多个表的批更新

Ruby on rails RubyonRails中多个表的批更新,ruby-on-rails,normalization,multiple-tables,Ruby On Rails,Normalization,Multiple Tables,我需要一些帮助来思考如何为RoR应用程序对多个表进行批更新。以下是我的模型 class User < ActiveRecord::Base has_many :addresses has_many :phones end class Address < ActiveRecord::Base belongs_to :user has_one :addresstype end class Phone &

我需要一些帮助来思考如何为RoR应用程序对多个表进行批更新。以下是我的模型

class User < ActiveRecord::Base  
    has_many :addresses  
    has_many :phones  
end  


class Address < ActiveRecord::Base  
    belongs_to :user  
    has_one    :addresstype      
end  


class Phone < ActiveRecord::Base  
    belongs_to :user  
    has_one    :phonetype  
end  


class PhoneType < ActiveRecord::Base  
    belongs_to :phone  
end  


class AddressType < ActiveRecord::Base      
    belongs_to :address    
end    
数以百万计的数据或者全部存储在一个文件中,或者从远程服务器传输的每个文件都有一条记录

或者,是否有其他方法按需处理这些远程请求?例如,远程服务器将记录发送到我的RoR应用程序,并通过RoR应用程序进行处理。 在这两种情况下,我都希望确保要插入的数据通过所有验证规则。如电子邮件格式有效,或地址不能为空

这些记录可以是json格式,以保存在文件中传输的数据大小

在处理用户时usr1@foo.com可能存在,也可能不存在

谢谢你,我真的很感谢你的帮助


阿塔朗。

两者都可以。如果您有一个文件,那么只需创建一个ruby脚本并包含config/environment.rb,即可在ruby脚本中加载rails应用程序的环境。然后,您可以加载文件并按如下方式处理每一行:

include 'config/environment.rb'
File.open("/folder/folder/file_to_parse", "r").each_line do |line| 
     .....
     # interpret line here
     ....
end
add_index :table_name, :column_name
如果是CSV格式,您也可以使用rubys CSV库http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html

另一方面,您还可以创建一个接口来解析JSON中的数据。您可以使用本文介绍的ruby的JSON实现:创建一个解析JSON中传输的单个对象的操作

//关于验证:

在模型中编写验证!然后你检查所有属于某物的型号,因为你可能已经有了实际记录中使用的电话类型。所以,当你不需要复制品时,要注意不要复制

之后,使用新方法创建新对象,而不是创建,因为create会写入数据库。然后解析该行,当解析该行时,可以使用有效的?方法,该方法检查对象是否通过了模型中定义的所有验证

只有当所有对象都通过了验证,才能将它们安全地保存到数据库中。否则,您只需不执行save方法,就不会将不通过vaidations的数据集存储在数据库中

//关于埃佩芬德

如果你只需要执行一次导入,那么如果脚本不是那么完美的话,这并不是什么大问题。当表中有很多条目时,你应该做什么100不是很多,100000是,。。您应该向所有外键列添加索引。您可以创建迁移AddIndexToForeignKeys,并使用add_index方法添加索引,如下所示:

include 'config/environment.rb'
File.open("/folder/folder/file_to_parse", "r").each_line do |line| 
     .....
     # interpret line here
     ....
end
add_index :table_name, :column_name

这将加快选择查询的速度,降低插入查询的速度,但我认为显示操作的调用频率将高于创建操作

大卫,谢谢你的回复。我将阅读更多关于json的内容。但是实际的插入呢。我是否需要按顺序执行以下操作?首先检查用户并插入新用户(如果找不到),然后获取用户标识,获取电话类型字符串的电话标识,以及地址类型字符串的地址标识。接下来插入带有用户id、地址类型id的地址记录,以及带有用户id、电话类型id的电话记录。或者有更好的方法吗?是的,你是对的,验证在模型中。有效吗?方法可用于验证。为了确保我理解正确,假设电话和地址类型存在,在典型情况下,将有3个选择或调用。首先使用电子邮件地址字符串查找用户id的方法,然后使用地址类型字符串查找地址类型id,使用电话类型字符串查找电话类型id,并且将至少有2个新对象,要验证和保存的地址和电话。对我来说,流动听起来不错。正当它提出了dbserver服务所有这些查询的效率或性能问题。Davidb,我将尝试您的建议并更新此报告。我真的很感谢你抽出时间。谢谢