Функции стрелок не привязывают this
. В соответствии с MDN:
Отсутствие привязки этого
До тех пор, пока функции стрелок, каждая новая функция не определила свое собственное значение
blockquote>this
(новый объект в случае конструктора, undefined в строгом режиме вызовы функций, объект контекста, если функция вызывается как «метод объекта» и т. д.). Это оказалось раздражающим объектно-ориентированным стилем программирования.Таким образом,
this
в вашем примере будет глобальным объектомwindow
, который, по-видимому, не имеет свойства, называемогоx
.Пример:
function foo() { let arrow = () => { console.log(this); // will use foo's this as arrow will never have its own this } arrow.call({"x": "x"}); // ... even if we specify it using bind, call, or apply } foo.call({"y": "y"}); // specifying the this for foo (this value will eventually be used by arrow because it will be availbale in its scope)
Вы хотите сохранить «среду db» для каждой ветви. Посмотрите на smudge / clean script, чтобы указать на разные экземпляры. Если у вас закончились экземпляры db, попросите сценарий отключить временный экземпляр, поэтому, когда вы переключаетесь на новую ветку, она уже существует и просто должна быть переименована скриптом. Обновления БД должны запускаться непосредственно перед выполнением ваших тестов.
Надеемся, что это поможет.
Я бы предложил один из двух вариантов:
seeds.rb
. Хорошим вариантом является создание ваших данных семян с помощью FactoryGirl / Fabrication gem. Таким образом, вы можете гарантировать, что данные синхронизируются с кодом, если мы предположим, что фабрики обновляются вместе с добавлением / удалением столбцов. rake db:reset
, который эффективно уменьшает / создает / семени базы данных. Вручную сохраняйте состояния базы данных, всегда запуская rake db:rollback
/ rake db:migrate
до / после проверки филиала. Предостережение заключается в том, что все ваши миграции должны быть обратимыми, иначе это не сработает.
В среде разработки:
Вы должны работать с rake db:migrate:redo
, чтобы проверить, является ли ваш скрипт обратимым, но имейте в виду, что всегда необходимо иметь seed.rb
с совокупностью данных.
Если вы работаете с git, вы должны изменить change.rb с изменением миграции и выполнением db:migrate:redo
для начала (загрузить данные для новой разработки на другой машине или новой базе данных)
Помимо «обмена», с вашими методами up и down ваш код всегда будет сценарием для «изменения» в этот момент и при запуске с нуля.
Я боролся с той же проблемой. Вот мое решение:
Я полностью ощущаю лаваш, который у вас здесь. Поскольку я думаю об этом, реальная проблема заключается в том, что у всех ветвей нет кода для отката определенных ветвей. Я в мире джанго, поэтому я не знаю, как это хорошо. Я играю идею о том, что миграции живут в своем собственном репо, который не имеет разветвленной (git-подмодуль, о которой я недавно узнал). Таким образом, все ветви имеют все миграции. Липкая часть гарантирует, что каждая ветвь ограничена только теми миграциями, которые им нравятся. Выполнение / отслеживание этого вручную было бы лайтом и подвержено ошибкам. Но для этого не созданы никакие инструменты миграции. Это тот момент, в который я не продвигаюсь вперед.
Вот сценарий, который я написал для переключения между ветвями, которые содержат разные миграции:
https://gist.github.com/4076864
It не решает все проблемы, о которых вы упомянули, но с указанием имени ветки:
Я всегда вручную делаю это в нашем проекте, поэтому я подумал, что было бы хорошо автоматизировать этот процесс.
git checkout db/schema.rb
, или вы имели в виду git checkout -- db/schema.rb
? (т. е. с двойными штрихами)
– user664833
25 August 2014 в 05:31
db/schema.rb
. :)
– Jon Lemmon
26 August 2014 в 07:25
Это единственный способ летать.
Я вернулся к этому через некоторое время и сделал некоторые улучшения:
bundle exec rake git:branch
. db:clone_from_branch
принимает переменную среды SOURCE_BRANCH
и TARGET_BRANCH
. При использовании git:branch
он автоматически использует текущую ветвь как SOURCE_BRANCH
. config/database.yml
И чтобы вам было проще, вот как вы обновляете свой файл database.yml
для динамического определения имени базы данных на основе текущей ветви.
<%
database_prefix = 'your_app_name'
environments = %W( development test )
current_branch = `git status | head -1`.to_s.gsub('On branch ','').chomp
%>
defaults: &defaults
pool: 5
adapter: mysql2
encoding: utf8
reconnect: false
username: root
password:
host: localhost
<% environments.each do |environment| %>
<%= environment %>:
<<: *defaults
database: <%= [ database_prefix, current_branch, environment ].join('_') %>
<% end %>
lib/tasks/db.rake
Вот задача Rake, чтобы легко клонировать вашу базу данных из одной ветки в другую. Это принимает переменные среды SOURCE_BRANCH
и TARGET_BRANCH
. Исход из задачи @spalladino .
namespace :db do
desc "Clones database from another branch as specified by `SOURCE_BRANCH` and `TARGET_BRANCH` env params."
task :clone_from_branch do
abort "You need to provide a SOURCE_BRANCH to clone from as an environment variable." if ENV['SOURCE_BRANCH'].blank?
abort "You need to provide a TARGET_BRANCH to clone to as an environment variable." if ENV['TARGET_BRANCH'].blank?
database_configuration = Rails.configuration.database_configuration[Rails.env]
current_database_name = database_configuration["database"]
source_db = current_database_name.sub(CURRENT_BRANCH, ENV['SOURCE_BRANCH'])
target_db = current_database_name.sub(CURRENT_BRANCH, ENV['TARGET_BRANCH'])
mysql_opts = "-u #{database_configuration['username']} "
mysql_opts << "--password=\"#{database_configuration['password']}\" " if database_configuration['password'].presence
`mysqlshow #{mysql_opts} | grep "#{source_db}"`
raise "Source database #{source_db} not found" if $?.to_i != 0
`mysqlshow #{mysql_opts} | grep "#{target_db}"`
raise "Target database #{target_db} already exists" if $?.to_i == 0
puts "Creating empty database #{target_db}"
`mysql #{mysql_opts} -e "CREATE DATABASE #{target_db}"`
puts "Copying #{source_db} into #{target_db}"
`mysqldump #{mysql_opts} #{source_db} | mysql #{mysql_opts} #{target_db}`
end
end
lib/tasks/git.rake
Эта задача создаст ветку git для текущей ветви (master , или иначе), проверьте его и клонируйте базу данных текущего филиала в базу данных нового филиала.
namespace :git do
desc "Create a branch off the current branch and clone the current branch's database."
task :branch do
print 'New Branch Name: '
new_branch_name = STDIN.gets.strip
CURRENT_BRANCH = `git status | head -1`.to_s.gsub('On branch ','').chomp
say "Creating new branch and checking it out..."
sh "git co -b #{new_branch_name}"
say "Cloning database from #{CURRENT_BRANCH}..."
ENV['SOURCE_BRANCH'] = CURRENT_BRANCH # Set source to be the current branch for clone_from_branch task.
ENV['TARGET_BRANCH'] = new_branch_name
Rake::Task['db:clone_from_branch'].invoke
say "All done!"
end
end
Теперь все, что вам нужно сделать, это запустить bundle exec git:branch
, ввести новое имя ветки и начать убивать зомби.
Если у вас есть большая база данных, которую вы не можете легко воспроизвести, я бы рекомендовал использовать обычные инструменты миграции. Если вам нужен простой процесс, это то, что я рекомендую:
rake db:rollback
) до состояния до точки ветвления. Затем, после переключения ветвей, запустите db:migrate
. Это математически корректно, и пока вы пишете скрипты down
, он будет работать. rake db:schema:load
и rake db:seed
, как сказал @noodl.
– pisaruk
30 August 2012 в 04:58
Возможно, вы должны принять это как подсказку о том, что ваша база данных разработки слишком велика? Если вы можете использовать db / seeds.rb и меньший набор данных для разработки, то ваша проблема может быть легко решена с помощью schema.rb и seeds.rb из текущей ветви.
Предполагается, что ваш вопрос связан развитию; Я не могу себе представить, почему вам нужно регулярно переключаться на производство.
Это то, что я сделал, и я не совсем уверен, что я рассмотрел все основы:
В разработке (с использованием postgresql):
Это намного быстрее, чем утилиты rake в базе данных с около 50 тыс. записей.
Для производства, поддерживайте основную ветвь как sacrosanct, и все миграции проверяются в, shema.rb правильно сливается. Пройдите стандартную процедуру обновления.
Когда вы добавляете новую миграцию в любом филиале, запустите rake db:migrate
и зафиксируйте как миграцию, так и db/schema.rb
. Если вы сделаете это, в процессе разработки вы сможете переключиться на другую ветвь, которая имеет другой набор миграций и просто запускает rake db:schema:load
.
Обратите внимание, что это воссоздает всю базу данных, а существующие данные будут потеряны.
Возможно, вы только хотите запустить производство из одной ветки, с которой вы очень осторожны, поэтому эти шаги там не применяются (просто запустите rake db:migrate
, как обычно там). Но в разработке не должно быть большого труда воссоздать базу данных из схемы, что будет rake db:schema:load
.
db/seeds.rb
. Не должно быть слишком разрушительным, чтобы уничтожить вашу базу данных разработки, если вы установите там некоторые разумные семенные данные.
– Andy Lindeman
21 January 2011 в 16:15
db/seeds.rb
для рипопуляции потерянных данных db
– pastullo
20 January 2014 в 21:38