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