добавление rake db: seed в rails и его запуск без дублирования данных

Это исправлено. Кажется, реализация изменилась.

override func viewDidLoad() {
        super.viewDidLoad()
        handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
            if user == nil {

                if let authUI = FUIAuth.defaultAuthUI() {
                    authUI.delegate = self
                    let authViewController = authUI.authViewController()
                    self.present(authViewController, animated: true, completion: {})
                }
            }
            else{
                self.userLbl.text = user?.displayName
            }
        })
    }

И вернуться к предыдущей версии:

pod 'Firebase/Core', '<5'
pod 'Firebase/Firestore', '<5'
pod 'FirebaseUI', '<5'
25
задан Joe Doyle 30 April 2012 в 01:14
поделиться

4 ответа

Я делаю что-то вроде этого..... Когда мне нужно добавить пользователя

в seeds.rb:

if User.count == 0
  puts "Creating admin user"
  User.create(:role=>:admin, :username=>'blagh', :etc=>:etc)
end

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

14
ответ дан 28 November 2019 в 20:36
поделиться

Еще один вариант, который может принести незначительный выигрыш в производительности:

# This example assumes that a role consists of just an id and a title.

roles = ['Admin', 'User', 'Other']
existing_roles = Role.all.map { |r| r.title }

roles.each do |role|
  unless existing_roles.include?(role)
    Role.create!(title: role)
  end
end

Я думаю, что для этого вам нужно сделать всего один вызов БД, чтобы получить массив того, что существует, тогда вам нужно позвонить снова, если чего-то не существует и его нужно создать.

8
ответ дан 28 November 2019 в 20:36
поделиться

Добавление


из

departments = ["this", "that"]
departments.each{|d| Department.where(:name => d).first_or_create}

в

departments = ["this", "that", "there", "then"]
departments.each{|d| Department.where(:name => d).first_or_create}

это простой пример,


Обновление / переименование


из

departments = ["this", "that", "there", "then"]
departments.each{|d| Department.where(:name => d).first_or_create}

-

departments = ["these", "those", "there", "then"]
new_names = [['these', 'this'],['those','that']]

new_names.each do |new| 
  Department.where(:name => new).group_by(&:name).each do |name, depts|
    depts.first.update_column :name, new[0] if new[1] == name # skips validation
    # depts[1..-1].each(&:destroy) if depts.size > 1 # paranoid mode
  end
end

departments.each{|d| Department.where(:name => d).first_or_create}

ВАЖНО: Вам необходимо обновить элементы массива departments, иначе дублирование обязательно произойдет.

Обойти: Добавить валидацию validates_uniqueness_of или валидацию уникальности, сравнивая все необходимые атрибуты, НО не используйте методы, пропускающие валидации .

0
ответ дан 28 November 2019 в 20:36
поделиться

Еще одна тривиальная альтернатива:

#categories => name, color 
categories = [
    [ "Category 1", "#e51c23" ],
    [ "Category 2", "#673ab7" ]
]

categories.each do |name, color|
  if ( Category.where(:name => name).present? == false )
    Category.create( name: name, color: color )
  end
end
-1
ответ дан 28 November 2019 в 20:36
поделиться
Другие вопросы по тегам:

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