Производительность: минимизировать попадание в базу данных - PullRequest
1 голос
/ 18 июня 2011

Я использую Ruby on Rails 3.0.7 и пытаюсь свести к минимуму попадание в базу данных.Для этого я извлекаю из базы данных все Article объекты, связанные с User, а затем выполняю поиск по этим извлеченным объектам.

Что я делаю:

stored_objects = Article.where(:user_id => <id>) # => ActiveRecord::Relation

<some_iterative_function_1>.each { |...|
  stored_object = stored_objects.where(:status => 'published').limit(1)
  ...
  # perform operation on the current 'stored_object' considered
}    
<some_iterative_function_2>.each { |...|
  stored_object = stored_objects.where(:visibility => 'public').limit(1)
  ...
  # perform operation on the current 'stored_object' considered
} 
<some_iterative_function_n>.each { |...|
  ...
}

Код stored_object = stored_objects.where(:status => 'published') действительно позволит избежать попадания в базу данных (я спрашиваю об этом, потому что в моем файле журнала все еще выполняется запрос к базе данных для итерации each)?Если нет, как я могу свести к минимуму попадание в базу данных?

PS: в нескольких словах я бы хотел поработать с ActiveRecord::Relation (массивом), но вызывался метод whereшвы, чтобы поразить базу данных.

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Rails имеет функциональность для одновременного захвата кусков базы данных, а затем итерации по строкам без повторного обращения к базе данных.

См. " Получение нескольких объектов в пакетах " для получения дополнительной информации о find_each и find_in_batches.

1 голос
/ 18 июня 2011

Как только вы начнете перебирать stored_objects (если это то, что вы делаете), они будут загружены из базы данных. Если вы хотите загрузить только опубликованные статьи пользователей, вы можете сделать это:

stored_objects = Article.where(:user_id => id, :status => 'published')

Если вместо этого вы хотите загрузить опубликованные и неопубликованные статьи и сделать что-то другое с опубликованными, вы можете сделать это:

stored_objects = Article.where(:user_id => id)
stored_objects.find_all { |a| a.status == 'published' }. each do |a|
    # ... do something with a published article
end

Или, возможно:

Article.where(:user_id => id).each do |article|
    case article.status
    when 'published'
        # ... do something with a published article
    else
        # ... do something with an article that's not published
    end
end

Каждый из этих примеров выполняет только один запрос к базе данных. Выбор того, с какими данными вы действительно хотите работать.

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