2

我加入了 Rails 团队并维护代码。有些对象是由 Gem virtus 控制的,但我真的不明白,就像下面的代码在做什么。

我理解属性'latest_book'可以从书籍中收集最新书籍的结果,但为什么可以这样做?'books=(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

你可以帮帮我吗?

4

1 回答 1

4

def books=(books)正在定义一个名为的方法books=,该方法采用单个参数books。是的,这很令人困惑。应该是def books=(value)or def books=(new_books)

是的,=是方法名称的一部分。self.books = value真的是语法糖self.books=(value)。再次,方法是books=

super bookssuper(books)super调用下一个继承或包含的同名方法;books=它是由创建的调用attribute :books, Array[Book]。这是一个“方法覆盖”,它允许您添加到现有方法的行为。

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]
于 2020-07-06T05:07:22.060 回答