gem 'ransack'
# 用户
class User
has_many :books
end
# 书本
class Book
belongs_to :user
end
class UserController
def index
@users = User.left_join(:books).ransack({:books_id_in=>params[:book_ids]}).result
render json: @users
end
end
页面大概是显示一个表,有以下两列,需求点:书名那列要显示所有拥有的书名
用户名 所有书名
user.name user.books.map(&:name).join(',')
这样会触发 sql n+1 问题 经过查询,后来改成了
class UserController
def index
@users = User.left_join(:books).ransack({:books_id_in=>params[:book_ids]}).result
@list = @users.preload(:books).map{|u| {username: u.name, book_names: u.books.map(&:name).join(',')} }
render ....
end
end
想请教一下除了上面这种,有其他优化的方法吗?
比如在查询的时候就直接把所有 has_many 的书的名字拼成了一个 sql 的字段,这样就不用再特地去遍历一遍了