gpt4 book ai didi

ruby-on-rails - Ruby on rails active record 查询哪个效率高

转载 作者:数据小太阳 更新时间:2023-10-29 08:19:33 26 4
gpt4 key购买 nike

我最近在做一个项目,在这个项目中,我面临着在两种获得相同结果的方式之间做出选择的两难选择。这是类结构:

class Book < ApplicationRecord
belongs_to :author
end

class Author < ApplicationRecord
has_many :books
end

作者有名字和姓氏。我想获取给定书籍的作者全名作为实例方法。

在简单的事件记录术语中,由于书籍与作者相关联,我们可以按如下方式获取书籍的作者姓名:

例如在 Book 类中,我们有:

class Book < ApplicationRecord
belongs_to :author

def author_name
"#{author.first_name} #{author.last_name}"
end

end

我们得到了结果!

但是,根据最小化依赖性的目标(POODR Book)、 future 易于更改和更好的面向对象设计,这本书不应该知道作者的属性。它应该通过接口(interface)与作者对象交互。

所以 Book 不应该是负责获取作者姓名的人。作者类应该。

class Book < ApplicationRecord
belongs_to :author

def author_name
get_author_name(self.author_id)
end

private

#minimizing class dependecies by providing private methods as external interfaces
def get_author_name(author_id)
Author.get_author_name_from_id(author_id)
end

end

class Author < ApplicationRecord
has_many :books

#class methods which provides a gate-way for other classes to communicate through interfaces, thus reducing coupling.

def self.get_author_name_from_id(id)
author = self.find_by_id(id)
author == nil ? "Author Record Not Found" : "#{author.first_name.titleize} #{author.last_name.titleize}"
end

end

现在,book 只是与 Author 提供的公共(public)接口(interface)进行交互,Author 负责从其属性中获取全名,这无疑是一个更好的设计。

我尝试在我的控制台中将查询作为两种不同的方法运行:

class Book < ApplicationRecord
def author_name
get_author_name(self.author_id)
end

def author_name2
"#{author.last_name} + #{author.first_name}"
end
end

结果如下图: enter image description here

看起来两者都运行相同的查询。

我的问题是

  1. rails 是否将 Book 类中调用的 author.last_name 转换为与内部调用的 Author.find_by_id(author_id).last_name 相同的 SQL 查询如果数据量更大,作者类(通过 Book 类传递的消息)?
  2. 在数据量较大的情况下,哪个性能更好?
  3. 不从 Book 类调用 author.last_name 违反设计原则 ?

最佳答案

实际上,使用委托(delegate)更为普遍和简单。

class Book < ApplicationRecord
belongs_to :author
delegate :name, to: :author, prefix: true, allow_nil: true
end

class Author < ApplicationRecord
has_many :books
def name
"#{first_name.titleize} #(last_name.titleize}"
end
end

至于性能,如果您在图书查询时加入 作者,您最终会执行单个查询。

@books = Book.joins(:author)

现在,当您遍历 @books 并单独调用 book.author_name 时,无需对 authors 表进行 SQL 查询。

关于ruby-on-rails - Ruby on rails active record 查询哪个效率高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47506689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com