В Ruby's Hash порядок его элементов произвольный.Когда он проверяет -ed (как в выводе консоли rails), метод inspect
просто использует each_pair
или что-то подобное, и поэтому порядок может быть произвольным.На практике порядок для Hash#each_pair
обычно соответствует порядку, в котором создается каждый элемент Hash;однако нет никакой гарантии!Кроме того, то, как Rails (или ActiveRecord) создает эти экземпляры, является другой проблемой (я предполагаю, что алфавитный порядок, который вы видите, возникает из-за того, как Rails их создал; это может иметь отношение к тому, как они хранятся в БД).В любом случае, суть в том, что вы не можете контролировать, как они хранятся, пока используется хэш.Но вы можете настроить, как они проверяют -ед.
Следующая стратегия состоит в том, чтобы переопределить ApplicationRecord#inspect
для любого из его дочерних классов, чтобы метод inspect
любых Моделей был изменен, нони одного из других классов.
Поместите следующий код в любой файл в каталоге app/
( например , очевидное имя файла - /app/models/application_record.rb
):
class ApplicationRecord
alias_method :inspect_orig, :inspect if ! self.method_defined?(:inspect_orig)
def inspect
klass = self.class
if klass == ApplicationRecord
return inspect_orig
end
attr_list = attribute_names.sort.map { |name| "#{name}: "+attributes[name].inspect }.join ', '
sprintf('<%s:0x%s %s>', klass.name, object_id.to_s(16), attr_list)
end
end
Или вместо этого вы можете запускать его каждый раз, когда открываете rails console
, если хотите активировать его только временно во время сеанса.
Обратите внимание, что имя родительского класса ApplicationRecord
может быть добавлено какследует (в случае Rails 5.2; но я не думаю, что включение родительского класса является обязательным, поскольку класс ApplicationRecord
должен быть определен до чтения файла).
class ApplicationRecord < ActiveRecord::Base
Я замечаювыходные данные вашей консоли rails выглядят немного иначе, чем мои Rails 5.2.1, возможно, из-за разницы в версиях (?).В приведенном выше фрагменте кода я попытался имитировать результаты, которые вы, похоже, получили.В любом случае настройте его по своему вкусу;теперь у вас есть полный контроль над ним!
EDIT1 :
Вышеприведенное описание относится к Rails 5. В Rails 4 имя класса должно быть
class ActiveRecord::Base
EDIT2 :
В приведенном выше фрагменте кода показано #object_id
( nb , оно не отображается в Rails 5.2).Однако то, что #inspect
показывает для экземпляров Object, отличается от #object_id
, как подробно объяснено в этого ответа .Если вы предпочитаете отображать его, используйте следующий способ (значение в левой части - это формат sprintf
):
'0x%016x' % (object_id << 1)