我的网页存在一些问题。
它运行速度非常慢,所以我在互联网上读到它可能是一个不好用的SQL。所以我评论了更“复杂”的SQL行,它又开始顺利运行了。
我的问题是:'有没有办法让这个SQL请求“更轻”?
@companies = Company.where('tbl_companys.state = "enabled"')
@companies = @companies.includes(:benefit).where("tbl_benefits.end_date >= {Date.today}" )
@companies = @companies.includes(:benefit).where(tbl_benefits: { state: 'enabled' })
has_benef_gastro = false
has_benef_hote = false
has_benef_ent = false
until has_benef_gastro == true
@esta_gastro = (@companies.where('id_category = "2-gastronomia"').shuffle)[0]
@benefit_gastro = Benefit.where('id_company = ? AND end_date >= ? AND state = "enabled"', @esta_gastro.id_company, Date.today).first
if @benefit_gastro.nil? == false
has_benef_gastro = true
end
end
until has_benef_hote == true
@esta_hotelero = (@companies.where('id_category = "1-hoteleria"').shuffle)[0]
@benefit_hote = Benefit.where('id_company = ? AND end_date >= ? AND state = "enabled"', @esta_hotelero.id_company, Date.today).first
if @benefit_hote.nil? == false
has_benef_gastro = true
end
end
until has_benef_ent == true
@esta_ent = (@companies.where('id_category = "3-entretenimiento"').shuffle)[0]
@benefit_ent = Benefit.where('id_company = ? AND end_date >= ? AND state = "enabled"', @esta_ent.id_company, Date.today).first
if @benefit_ent.nil? == false
has_benef_gastro = true
end
end
感谢您的帮助!
答案 0 :(得分:0)
您每次都在调整@esta_gastro
,@esta_hotelero
,@esta_ent
和@benefit_
变量,这实际上没有意义。每次执行循环时都需要多个新的数据库查询。
如果你想找到一个随机选择,只需在循环外创建你的集合,一次洗牌(在循环之外),然后迭代这些集合直到你符合你的标准。
例如:
@esta_gastro = @companies.where('id_category = "2-gastronomia"').shuffle
@benefits = Benefit.where('end_date >= ? AND state = "enabled"', Date.today)
@benefit_gastro = nil
i = 0
until !@benefit_gastro.blank?
@benefit_gastro = @benefits.where('id_company = ?', @esta_gastro[i].id_company).first
i += 1
end
修改强>
如果整个目标是定义@benefit_gastro
,那么我甚至认为你不需要循环。您可以只定义@esta_gastro
集,然后使用它查找对应的所有好处。由于@esta_gastro
被随机播放,因此@benefit_gastro
将是随机的:
@esta_gastro = @companies.where('id_category = "2-gastronomia"').shuffle
@benefit_gastro = Benefit.where('end_date >= ? AND state = "enabled"', Date.today).where('id_company = ?', @esta_gastro.map(&:id)).limit(1)
答案 1 :(得分:0)
我最终做了一个简单的SQL请求,所以我不必为一些rails问题而烦恼。
非常感谢!