我有一个名为Book的类,它带有方法self.to_csv
。
这有效:
books = Book.all
books.to_csv
但是,如果我有一堆书,那就不会了。问题是如何使用数组获得相同的结果?
Book.all = [Book1,Book2]
myArray = [Book1,Book2]
有什么区别?
我有一个名为Book的类,它带有方法self.to_csv
。
这有效:
books = Book.all
books.to_csv
但是,如果我有一堆书,那就不会了。问题是如何使用数组获得相同的结果?
Book.all = [Book1,Book2]
myArray = [Book1,Book2]
有什么区别?
问题是如何通过数组获得相同的结果:
Book.where(id: [Book1,Book2]).class
# Book::ActiveRecord_Relation
问题是,如何定义to_csv
。如果它是类级别的(即Book模型中的类方法),则在Post::ActiveRecord_Relation
书中调用它时将可以访问它,因为它可以通过ActiveRecord委托进行工作:
Book.all.respond_to?(:to_csv)
# true
Book.all.method(:to_csv).source_location
# ["/Users/user/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/relation/delegation.rb",64] # or similar
虽然一堆书就是那一堆书。而且,如果您还没有接触过Array类,就不会有to_csv
方法:
[Book1,Book2].class
# Array
[Book1,Book2].respond_to?(:to_csv)
# false
因此,没有方法定义:
[Book1,Book2].method(:to_csv).source_location
# NameError: undefined method `to_csv' for class `Array'
# Did you mean? to_s
,
在Rails中,.all
方法返回一个ActiveRecord_Relation
对象。
尽管此对象类型与Array
有一些相似之处,例如Enumerable
继承的方法,但该对象不是Array
类的实际实例。
简短的回答是,您确实不能也可能不应期望Array
的实例表现得像ActiveRecord_Relation
的实例那样。
但是您可能真正想做的是:
books = Book.where(id: [Book1.id,Book2.id])
这将返回一个ActiveRecord_Relation
对象。所以现在您应该能够做到
books.to_csv
也许在
上做一些阅读https://guides.rubyonrails.org/association_basics.html
https://api.rubyonrails.org/classes/ActiveRecord/Relation.html