Используя named_scope для получения количества строки

Нет действительно удобного способа сделать это, но вы можете создать его из инструментов, предоставляемых Git. Основным инструментом, который требуется, является этот git merge-file, который выполняет трехстороннее слияние на одном трио версий файлов, то есть base + ours + их версии. Он принимает опции --ours и --theirs для разрешения конфликтов так же, как это делают -X ours и -X theirs для общего слияния, т. Е. Он не просто берет наш файл или их ] файл , он берет наших или их только в конфликтных точках.

Это все замечательно, но где взять три версии? Git остановился с конфликтом слияний, скажем, main.py. В вашем рабочем дереве main.py содержит беспорядок, оставленный Git, с маркерами <<<<<<< ... >>>>>>> вокруг конфликтующих строк. Но git merge-file нужны три неотмеченных входных файла для базовой версии слияния, «нашей» версии и «их» версии. Но эти три файла находятся в индексе ! Если файл F имел конфликт, существует :1:F с базовой версией слияния, :2:F с нашей и :3:F с их.

Чтобы получить их, вы можете использовать git show или git checkout-index. Последний на самом деле правильный инструмент: git mergetool использует git checkout-index, с этой маленькой функцией оболочки:

checkout_staged_file () {
        tmpfile=$(expr \
                "$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \
                : '\([^ ]*\)    ')

        if test $? -eq 0 && test -n "$tmpfile"
        then
                mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3"
        else
                >"$3"
        fi
}

Вызывается как checkout_staged_file 1 main.py main.py.base, например, он извлекает stage-1 (базу слияния) копия main.py - main.py.base. Повторите с 2 и 3 и подходящими вариантами для третьего аргумента, чтобы получить все три файла. Затем запустите git merge-file для трех файлов, как описано в в документации git merge-file .

(Подробнее см. исходный код git mergetool . Это просто большой сценарий оболочки, поэтому его довольно легко читать и изменять для собственных целей.)

12
задан unknownuser 4 January 2009 в 17:10
поделиться

3 ответа

Функциональность, которую Вы ищете, встроена.

Foobar.count # SELECT count(*) AS count_all FROM "foobars"
Foobar.named_scope.count # SELECT count(*) AS count_all FROM "foobars" WHERE ....

Если Вы работаете script/server в dev режиме Вы будете видеть запросы, поскольку они выполняются.

20
ответ дан 2 December 2019 в 06:27
поделиться

Я не думаю, что это корректно вообще. Объемы используются для совершенствования, находят операторы, и запрос количества не будет играть хорошо с ними.

2
ответ дан 2 December 2019 в 06:27
поделиться

Существует лучший способ сделать это, направляющие уже дает Вам средства.

Используя Ваш пример, Вы могли просто сделать это:

@foobar_size = Foobar.all.size #returns integer equal to total rows of Foobar

и даже определите объем его как так:

@banned_foobars = Foobar.scope_to_find_banned.size #returns integer equal to total rows for "scope_to_find_banned"
2
ответ дан 2 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

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