Ruby / Rails - вложенные блоки без попадания в БД каждый раз? - PullRequest
0 голосов
/ 25 октября 2009

Не совсем уверен, как это найти, но я нигде не нахожу решения. Я хочу назначить массиву пользователей массив сайтов. Вот так:

users = User.all
sites = Site.all

users.each do |user|
  sites.each do |site|
     user.websites << site
  end
end

Очевидно, это не работает, потому что я что-то упускаю из области видимости блока. Однако это работает:

users.each do |user|
  Site.all.each do |site|
    user.websites << site
  end
end

Но я пытаюсь устранить дополнительные вызовы в БД (Site.all.each ...) и узнать кое-что о Ruby в процессе. Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 25 октября 2009

Если ваша пользовательская модель имеет много связей с веб-сайтами (классы сайтов), вы можете просто сделать

users = User.all
sites = Site.all

users.each do |user|
  user.websites = sites
end

Редактировать: для Harpastum:

Если user.websites содержитпредметы, которых нет в Site.all, которые вы не хотите перезаписывать следующими работами.

users = User.all
sites = Site.all

users.each do |user|
  user.websites << sites
end
1 голос
/ 25 октября 2009

Я не уверен, почему первая попытка не сработает, но я также не совсем понимаю, почему вы добавляете каждый сайт отдельно. Разве это не сработает?

users = User.all
sites = Site.all

users.each do |user|
    user.websites.concat(sites)
end

ссылка ruby-doc на concat

Если они на самом деле хэши (хотя вы говорите, что они массивы), то метод, который вы ищете, это слияние

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