Rails:向三个连接表导入大量数据

时间:2010-02-11 09:51:12

标签: ruby-on-rails performance

我正在寻找一种解决我的rails应用程序中的性能问题的好方法。我有三个表:中间有一对一到多个连接。如果我想用第一个表中的130个项填充下表的所有数据,它会产生大约1000个查询,大约需要10秒(SQLite DB)。

我找到了

  

accept_nested_attributes_for

语句,使您可以在一行代码中输入多个表的数据。我的问题是,从性能的角度来看,这是一个很好的选择。有人有经验吗?

由于 马库斯

2 个答案:

答案 0 :(得分:0)

这里是:

Table: cards  
front_side_id  
back_side_id

Table: card_sides

Table: card_side_entries  
card_side_id

我现在有这样的XML:

<Cards>
  <Card>
    <FrontSide>
      <CardSideEntries>
        <CardSideEntrie/>
        ...
      </CardSideEntries>
    </FrontSide>
    <BackSide>
      <CardSideEntries>
        <CardSideEntrie/>
        ...
      </CardSideEntries>
    </BackSide>
  </Card>
  ...
</Cards>

在我的解决方案中,我逐行解析整个XML文件,因为我有时需要card_id,我必须两次保存某个表项...现在有人关于accept_nested_attributes_for吗?

谢谢, 马库斯

答案 1 :(得分:0)

accept_nested_attributes_for增加 ActiveRecord 的可能性,以便能够直接从一个模型写入关联。

示例: 你有这样的模型:

class User
   accepts_nested_attributes_for :cars
end

class Car
 belongs_to :user
end

和哈希一样:

param[:user] = {}
params[:user][:name] = "Mike"
params[:user][:car] = {}
params[:user][:car][:brand] = "Nissan"

User.create(params[:user])

这将创建一个新用户和一辆新车, 没有 accepts_nested_attributes_for

@user = User.create(params[:user])
@car = Car.create(params[:user][:car])
@user.car = @car

此功能通常与HTML表单中的 fields_for 一起使用,因此您可以轻松处理对象及其关联的创建。

在你的情况下,我想象你的模型(关于你的XML):

class Card
  has_one :front_side, :class => "Side"
  has_one :back_side, :class => "Side"
end

class Side
  belongs_to :card
  has_many :card_side_entry
end

class CardSideEntry
  belongs_to :side
end

我不知道你的XML来自哪里(你的数据是从中提取的?),但我想你可以使用accepts_nested_attributes_for,这样你就可以让每个卡片哈希生成关联。 但我不确定是否了解所有问题以及这是否是最佳解决方案