Нет действительно удобного способа сделать это, но вы можете создать его из инструментов, предоставляемых 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
. Это просто большой сценарий оболочки, поэтому его довольно легко читать и изменять для собственных целей.)
Функциональность, которую Вы ищете, встроена.
Foobar.count # SELECT count(*) AS count_all FROM "foobars"
Foobar.named_scope.count # SELECT count(*) AS count_all FROM "foobars" WHERE ....
Если Вы работаете script/server
в dev режиме Вы будете видеть запросы, поскольку они выполняются.
Я не думаю, что это корректно вообще. Объемы используются для совершенствования, находят операторы, и запрос количества не будет играть хорошо с ними.
Существует лучший способ сделать это, направляющие уже дает Вам средства.
Используя Ваш пример, Вы могли просто сделать это:
@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"