Делать это в хэше или в модели - PullRequest
0 голосов
/ 31 июля 2011

У меня есть ситуация, когда у меня есть несколько сотен записей в таблице поиска. Часто в коде мне приходится искать входящие значения, используя таблицу.

Каждый такой поиск приводит к отключению БД. Как бы оптимизирован он ни был, это будет стоить со стороны ввода / вывода. Я думаю, я не должен получить все в хэш. тем самым уменьшая количество отключений дб только до одного.

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

Ищете мнения? лучшие практики ? переживания?

1 Ответ

1 голос
/ 31 июля 2011

Поиск их по одному бесполезно расточительно. Вы можете не заметить пустую трату с небольшими числами, с которыми вы имеете дело, но вредные привычки - это вредные привычки, и, в общем, хорошие привычки лучше.

Вы должны загрузить все записи, которые вам нужны, одним попаданием в базу данных. Если они нужны вам как объекты, тогда Set объектов (или хеш, который отображает их идентификаторы на объект) будет иметь смысл; если вам нужно только знать, существуют ли они, добавьте метод в модель примерно так:

def self.valid_ids_from(ids)
    # Ask the database which things in the `ids` array it has
    # and put those in `ids_that_are_there`.
    Set.new(ids_that_are_there)
end

Тогда вы могли бы сделать что-то вроде этого:

known_ids = Pancake.valid_ids_from(incoming_ids)
good, bad = incoming_ids.partition { |x| known_ids.include?(x) }

Вы можете использовать Hash , если вам не нравится Set , разница для чего-то подобного незначительна.

Как обычно, конкретная реализация зависит от ваших требований. Но не бойтесь добавлять в свои модели методы, которые собирают и массируют определенные коллекции данных.

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