Данные отбора с приспособлениями, опасными в Ruby on Rails

Начиная с версии 3.7.0 и выше , pymongo устарела . Вместо этого используйте Collection.count_documents . Запуск cursor.count или collection.count приведет к появлению следующего предупреждающего сообщения:

DeprecationWarning: count is deprecated. Use Collection.count_documents instead.

Для использования count_documents код можно настроить следующим образом

import pymongo

db = pymongo.MongoClient()
col = db[DATABASE][COLLECTION]

filter = {"test_set":"abc"}
sort = [("abc",pymongo.DESCENDING)]
skip = 10
limit = 10

doc_count = col.count_documents(filter, skip=skip)
results = col.find(filter).sort(sort).skip(skip).limit(limit)

for doc in result:
   //Process Document

Примечание: Метод count_documents работает относительно медленно по сравнению с методом count. Для оптимизации вы можете использовать collection.estimated_document_count . Этот метод возвращает приблизительное количество документов (как следует из названия) на основе метаданных коллекции.

11
задан Yu Hao 1 December 2013 в 02:53
поделиться

5 ответов

Заполнение данных с помощью фикстур - крайне плохая идея.

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

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

Есть много решений для этого. Мой личный фаворит - задача rake, которая запускает сценарий Ruby, который просто использует ActiveRecord для вставки записей. Это то, что Rails 3 будет делать с db: seed , но вы можете легко написать это сами.

Я дополняю это методом, добавленным к ActiveRecord :: База называется create_or_update . Используя это, я могу запускать исходный сценарий несколько раз, обновляя старые записи вместо того, чтобы генерировать исключение.

Я написал статью об этих методах некоторое время назад под названием Загрузка исходных данных .

18
ответ дан 3 December 2019 в 03:19
поделиться

For the first part of your question, yes I'd just put some precaution for running a task like this in production. I put a protection like this in my bootstrapping/seeding task:

task :exit_or_continue_in_production? do
  if Rails.env.production?
    puts "!!!WARNING!!! This task will DESTROY " +
         "your production database and RESET all " +
         "application settings"
    puts "Continue? y/n"
    continue = STDIN.gets.chomp
    unless continue == 'y'
      puts "Exiting..."
      exit! 
    end
  end
end

I have created this gist for some context.

For the second part of the question -- usually you really want two things: a) very easily seeding the database and setting up the application for development, and b) bootstrapping the application on production server (like: inserting admin user, creating folders application depends on, etc).

I'd use fixtures for seeding in development -- everyone from the team then sees the same data in the app and what's in app is consistent with what's in tests. (Usually I wrap rake app:bootstrap, rake app:seed rake gems:install, etc into rake app:install so everyone can work on the app by just cloning the repo and running this one task.)

I'd however never use fixtures for seeding/bootstrapping on production server. Rails' db/seed.rb is really fine for this task, but you can of course put the same logic in your own rake app:seed task, like others pointed out.

4
ответ дан 3 December 2019 в 03:19
поделиться

Как насчет того, чтобы просто удалить задачу с рабочего сервера после заполнения базы данных?

1
ответ дан 3 December 2019 в 03:19
поделиться

Rails 3 решит эту проблему за вас с помощью файла seed.rb.

http://github.com/ brynary / rails / commit / 4932f7b38f72104819022abca0c952ba6f9888cb

2
ответ дан 3 December 2019 в 03:19
поделиться

У меня только что появилась интересная идея ...

что, если бы вы создали \ db \ seed \ и добавили файлы стиля миграции:

file: 200907301234_add_us_states.rb

class AddUsStates < ActiveRecord::Seeds

  def up
    add_to(:states, [
      {:name => 'Wisconsin', :abbreviation => 'WI', :flower => 'someflower'},
      {:name => 'Louisiana', :abbreviation => 'LA', :flower => 'cypress tree'}
      ]
    end
  end

  def down
    remove_from(:states).based_on(:name).with_values('Wisconsin', 'Louisiana', ...)
  end
end

поочередно :

  def up
    State.create!( :name => ... )
  end

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

мысли?

1
ответ дан 3 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: