我加入了Rails团队并维护代码。有些对象是由Gem virtus控制的,但我真的不明白下面的代码是怎么做的。
我理解'latest_book‘属性可以从图书中收集最新图书的结果,但是为什么可以这样做呢?“books=(书籍)”在做什么?为什么“超级图书”会出现在这里?
class GetBooks
include Virtus.model
include ActiveModel::Model
attribute :books, Array[Book]
attribute :latest_book, Book
def books=(books)
self.latest_book = books.sort_by { |book| book['createdate'] }.last
super books
end
end你能帮我一下吗?
发布于 2020-07-06 13:07:22
def books=(books)正在定义一个名为books=的方法,该方法只接受一个参数books。是的,这是令人困惑的。它可能应该是def books=(value)或def books=(new_books)。
是的,=是方法名称的一部分。self.books = value实际上是self.books=(value)的语法糖。同样,该方法是books=。
super books是super(books)。super调用下一个继承或包含的同名方法;它调用由attribute :books, Array[Book]创建的books=。这是一个"method override",它允许您添加到现有方法的行为。
当调用books=时,它会更新latest_books,然后调用其原始方法来设置books属性。
gb = GetBooks.new
gb.books = [old_book, new_book]
p gb.latest_book # new_book
p gb.books # [old_book, new_book]https://stackoverflow.com/questions/62749317
复制相似问题