Не допустите таблицу в schema.rb во время миграций

Спасибо Greg и Dave для обратной связи. Не был вполне, что я искал, но я решил поместить немного времени в исследование его и предложил это быстрое и грязное решение:

<?php
    $functions = array();
    $path = "/path/to/my/php/project";
    define_dir($path, $functions);
    reference_dir($path, $functions);
    echo
        "<table>" .
            "<tr>" .
                "<th>Name</th>" .
                "<th>Defined</th>" .
                "<th>Referenced</th>" .
            "</tr>";
    foreach ($functions as $name => $value) {
        echo
            "<tr>" . 
                "<td>" . htmlentities($name) . "</td>" .
                "<td>" . (isset($value[0]) ? count($value[0]) : "-") . "</td>" .
                "<td>" . (isset($value[1]) ? count($value[1]) : "-") . "</td>" .
            "</tr>";
    }
    echo "</table>";
    function define_dir($path, &$functions) {
        if ($dir = opendir($path)) {
            while (($file = readdir($dir)) !== false) {
                if (substr($file, 0, 1) == ".") continue;
                if (is_dir($path . "/" . $file)) {
                    define_dir($path . "/" . $file, $functions);
                } else {
                    if (substr($file, - 4, 4) != ".php") continue;
                    define_file($path . "/" . $file, $functions);
                }
            }
        }       
    }
    function define_file($path, &$functions) {
        $tokens = token_get_all(file_get_contents($path));
        for ($i = 0; $i < count($tokens); $i++) {
            $token = $tokens[$i];
            if (is_array($token)) {
                if ($token[0] != T_FUNCTION) continue;
                $i++;
                $token = $tokens[$i];
                if ($token[0] != T_WHITESPACE) die("T_WHITESPACE");
                $i++;
                $token = $tokens[$i];
                if ($token[0] != T_STRING) die("T_STRING");
                $functions[$token[1]][0][] = array($path, $token[2]);
            }
        }
    }
    function reference_dir($path, &$functions) {
        if ($dir = opendir($path)) {
            while (($file = readdir($dir)) !== false) {
                if (substr($file, 0, 1) == ".") continue;
                if (is_dir($path . "/" . $file)) {
                    reference_dir($path . "/" . $file, $functions);
                } else {
                    if (substr($file, - 4, 4) != ".php") continue;
                    reference_file($path . "/" . $file, $functions);
                }
            }
        }       
    }
    function reference_file($path, &$functions) {
        $tokens = token_get_all(file_get_contents($path));
        for ($i = 0; $i < count($tokens); $i++) {
            $token = $tokens[$i];
            if (is_array($token)) {
                if ($token[0] != T_STRING) continue;
                if ($tokens[$i + 1] != "(") continue;
                $functions[$token[1]][1][] = array($path, $token[2]);
            }
        }
    }
?>

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

14
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

Оказывается, есть вариант именно для этой ситуации!

Я нашел его в activerecord-2.3.4 / lib / active_record / schema_dumper.rb :

##
# :singleton-method:
# A list of tables which should not be dumped to the schema. 
# Acceptable values are strings as well as regexp.
# This setting is only used if ActiveRecord::Base.schema_format == :ruby
cattr_accessor :ignore_tables 
@@ignore_tables = []

Так что все, что мне нужно было сделать, это вставить это в конец environment.rb:

ActiveRecord::SchemaDumper.ignore_tables = ["table_name"]

Параметр ignore_tables будет принимать регулярные выражения. Например, чтобы игнорировать все таблицы, начинающиеся с "MS":

ActiveRecord::SchemaDumper.ignore_tables = [/^MS/]
35
ответ дан 1 December 2019 в 07:39
поделиться

Я думаю, что если вы сохраните миграцию для создания таблицы из папки миграции, она не будет запущена и, в свою очередь, не будет использоваться для создания базы данных разработки, что должно держать его вне schema.rb.

Вероятно, вы сможете найти способ запустить эту единственную миграцию, если вам нужно выйти за пределы задачи rake (нужно просто установить соединение, а затем запустить класс миграции)

0
ответ дан 1 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

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