Ruby: DataMapper и имеет,: xyz,: through => Ресурс - PullRequest
0 голосов
/ 17 декабря 2010

Я столкнулся со следующей проблемой: есть 2 модели: X и Y, они связаны друг с другом следующим образом: has n, :<name>, :through => Resouce;когда я делаю что-то вроде x.ys = array_with_500_ys, это занимает очень много времени, потому что DataMapper вставляет только одну ассоциацию на запрос (insert into xs_ys(x_id, y_id) values(xid, yid)).Это занимает очень много времени.Вопрос: как сделать это быстрее?

Спасибо.

1 Ответ

0 голосов
/ 01 января 2011

Поскольку DataMapper абстрагировал «бэкэнд», стандартным поведением является вставка одной записи за раз в виде SQL (или чего бы вы ни использовали).

Предполагается, что вы используете бэкэнд SQL, напримерPostgres, вы можете вернуться к сырому SQL и сделать следующее:

x = X.first
query = "INSERT INTO xs_ys(x_id, y_id) VALUES"
vals = []
array_with_500_ys.each do |y|
  vals << "(#{x.id}, #{y.id})"
end

repository.adapter.execute(query + vals.join(','));

Это создает одну «вставку», пропуская все записи для вставки.Не уверен, что это будет быстрее, но вы можете поместить его в фоновую работу, если вам нужно, чтобы приложение не тянуло время для пользователя.

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