MST

星途 面试题库

面试题:Ruby动态构建SQL语句并优化

在一个大型电商应用中,有多个复杂查询需求,需要根据不同的用户角色(如普通用户、管理员、供应商等)动态构建SQL语句来获取商品信息。商品表`products`有众多字段(`product_id`、`product_name`、`price`、`category`、`stock`、`description`等),并且关联了`product_images`表(`image_id`、`product_id`、`image_url`)和`product_reviews`表(`review_id`、`product_id`、`user_id`、`rating`、`review_text`)。请用Ruby实现一个通用的函数,能够高效地根据不同角色需求动态构建SQL语句,不仅要保证SQL注入防范,还要考虑到查询性能优化,例如合适的索引使用、查询语句优化等。并简要说明你采取的性能优化策略及原因。
44.6万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
require 'active_record'

# 假设已经建立好数据库连接,配置好ActiveRecord

# 商品模型
class Product < ActiveRecord::Base
  has_many :product_images
  has_many :product_reviews
end

# 图片模型
class ProductImage < ActiveRecord::Base
  belongs_to :product
end

# 评论模型
class ProductReview < ActiveRecord::Base
  belongs_to :product
end

def build_query(user_role, conditions = {})
  query = Product.joins(:product_images, :product_reviews)
  case user_role
  when '普通用户'
    query = query.select('products.*, product_images.image_url, product_reviews.rating')
  when '管理员'
    query = query.select('products.*, product_images.image_url, product_reviews.*')
  when '供应商'
    query = query.select('products.*, product_images.image_url')
  else
    raise ArgumentError, '不支持的用户角色'
  end

  conditions.each do |key, value|
    query = query.where(key => value)
  end

  query
end

性能优化策略及原因

  1. 索引使用
    • products表的常用查询字段上(如categoryprice等)建立索引。因为索引可以加快数据的查找速度,特别是在WHERE条件中使用这些字段进行过滤时,数据库可以通过索引快速定位到符合条件的数据行,而不需要全表扫描。
    • product_images表的product_id字段和product_reviews表的product_id字段上建立索引。这两个表通过product_idproducts表关联,这些索引有助于快速连接相关表的数据,提高连接查询的效率。
  2. 查询语句优化
    • 使用ActiveRecordjoins方法来关联多个表,而不是手动编写复杂的SQL连接语句。ActiveRecord会根据数据库的特性自动优化连接方式,提高查询效率。
    • 根据不同的用户角色,只选择需要的字段(select方法)。这样可以减少从数据库中检索的数据量,降低网络传输开销和内存占用,提高查询性能。
    • 使用where方法来添加动态条件,ActiveRecord会对传入的条件进行安全处理,有效防范SQL注入攻击。同时,where方法在生成SQL语句时会进行优化,确保条件的正确应用。