Rails: огромный импорт данных в три связанные таблицы - PullRequest
0 голосов
/ 11 февраля 2010

Я ищу хороший способ решения проблем с производительностью в моем приложении rails. У меня есть три таблицы, которые имеют: один к одному на много связей между ними. Если я хочу заполнить 130 элементов первой таблицы всеми данными для нижележащих таблиц, это приводит к примерно 1000 запросам и занимает около 10 секунд (БД SQLite).

Я нашел

accept_nested_attributes_for

оператор witch позволяет вводить данные для нескольких таблиц в одну строку кода. Мой вопрос, является ли это хорошим вариантом с точки зрения производительности. У кого-нибудь есть опыт?

Спасибо Маркус

Ответы [ 2 ]

0 голосов
/ 11 февраля 2010

accept_nested_attributes_ для добавления возможности 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])

Это создаст нового пользователя и новую машину, без accept_nested_attributes_for :

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

Эта функция обычно имеет fields_for в формах HTML, поэтому вы можете легко обрабатывать создание объекта и его ассоциаций.

В вашем случае я представляю ваши модели такими (относительно вашего 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, чтобы каждый хэш карты генерировал ассоциации. Но я не уверен, чтобы понять все проблемы, и если это лучшее решение

0 голосов
/ 11 февраля 2010

вот оно:

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?

Спасибо, Markus

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...