2013-06-20 5 views
4

Я видел это ...Преобразовать Active Record установлен в массив хэшей

How to convert activerecord results into a array of hashes

и хотел создать метод, который позволил бы мне превратить любой области видимости или не в области видимости записи установлен в массив хешей. Я добавил это в свою модель:

def self.to_hash 
    to_a.map(&:serializable_hash) 
end 

Однако, я получаю эту ошибку.

NameError: undefined local variable or method `to_a' for #<Class:0x007fb0da2f2708> 

Есть идеи?

ответ

14

Возможно, вам тоже нужно позвонить all. Просто to_a будет работать нормально в области видимости или существующем наборе результатов (например, User.active.to_hash), но не непосредственно на модели (например, User.to_hash). Использование all.to_a будет работать для обоих сценариев.

def self.to_hash 
    all.to_a.map(&:serializable_hash) 
end 

Обратите внимание, что all.to_a немного дублируют так all уже возвращает массив, но в Rails 4 будет необходимо.

+0

спасибо, если вы на этот вызов, я я чрезвычайно застрял в этом вопросе. http://stackoverflow.com/questions/17222379/calculate-percent-of-total-from-scoped-records-and-display-virtual-attributes-r – user2012677

+2

... в рубине есть простой способ. f ** king magic .. – gotqn

1

Выполнение действия над классом, а не экземпляр класса. Вы можете отнять self. затем вызвать это на примере, или вызвать его на коллекции вам нужно передать коллекцию в метод класса:

def self.to_hash(collection) 
    collection.to_a.map(&:serializable_hash) 
end 
+0

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

+0

Спасибо Дилан, пришел к такому выводу также сразу после публикации. – Matt

+1

Вы можете использовать другие области/запросы. 'User.active.to_hash' по-прежнему будет возвращать хеш активных пользователей. 'all' не сбрасывает масштаб, но' unscoped' будет. (Имейте в виду, что этот метод класса можно вызвать в области/отношении, он не ограничивается только вызовом только самого класса, такого как 'User.to_hash') –