В модели Rails 3.2, надеялся создать «to_csv» метод класса для создания CSV выход из сферы ActiveRecord, как это:ActiveRecord :: Отношение хитов метод массива вместо моего метода класса
class Post
# ...
def self.to_csv(options = {})
CSV.generate(options) do |csv|
scoped.each {|post| csv << record.attributes.values_at('title', 'text')}
end
end
end
Я ожидал, что я мог бы использовать его как это:
User.first.posts.to_csv
Однако этот метод, как представляется, переопределить метод массива #to_csv. Даже если я делаю это:
User.first.posts.scoped.to_csv
... и результат от User.first.posts.scoped явно ActiveRecord :: Отношения, я до сих пор попал метод Array. Если я переименую метод на что-то вроде «to_csvx», он работает так, как ожидалось.
Я надеюсь, что кто-то может объяснить, как/почему объект ActiveRecord :: Relation предпочтительно удаляет метод Array #to_csv вместо метода to_csv. Хотя это (метод класса, ожидающий вызова по объему AR) кажется правдоподобным, мне интересно, есть ли неотъемлемая проблема всей идеи?
На первый взгляд это похоже на http://stackoverflow.com/questions/224128/how-do-you-make-a-method-apply-to-a-collection-of-activerecord-objects, но Фактическая точка этого вопроса заключается в том, как я могу получить записи, которые мне нужно скрывать, связывая это в конце цепочки отношений вместо того, чтобы передавать их в качестве аргумента. –
Я просто угадываю здесь: ваш метод 'Array # to_csv', кажется, исходит из патча gem/monkey (AFAIK это не из рельсов). Возможно, этот драгоценный камень также обезьяна исправляет 'Relation', чтобы делегировать' to_csv' 'to_a' (см. [ActiveRecord :: Delegation] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record /relation/delegation.rb)). Это объясняет вашу проблему и почему используется другое имя метода. –
Я должен был заметить версию Ruby (1.9.3) Метод Array to_csv показан здесь: http://apidock.com/ruby/Array/to_csv –