Book.all类与一系列书籍之间的区别

我有一个名为Book的类,它带有方法self.to_csv。 这有效:

books = Book.all 
books.to_csv 

但是,如果我有一堆书,那就不会了。问题是如何使用数组获得相同的结果?

Book.all = [Book1,Book2]
myArray = [Book1,Book2]

有什么区别?

lanyangyang1 回答:Book.all类与一系列书籍之间的区别

问题是如何通过数组获得相同的结果

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

本文链接:https://www.f2er.com/3123245.html

大家都在问