ruby-on-rails – Rails Postgres查询,仅选择出现在具有关联的所有搜索参数中的项目

ruby-on-rails – Rails Postgres查询,仅选择出现在具有关联的所有搜索参数中的项目,第1张

概述我正在寻找基于一些用户选择参数创建Postgres查询. 用户将选择商店以及开始和结束年份.一旦提交,我只想显示项目的平均价格,如果它们仅存在于所选的所有年份中. 例如,用户选择2014年的开始日期和2018年的结束日期.项目香蕉功能在所有这些年份,但苹果仅在2014年,2015年和2017年功能.所以我的最终结果将只显示香蕉的平均价格而不是苹果. 到目前为止,这是我开发的查询.我不确定如何最好地 我正在寻找基于一些用户选择参数创建Postgres查询.

用户将选择商店以及开始和结束年份.一旦提交,我只想显示项目的平均价格,如果它们仅存在于所选的所有年份中.

例如,用户选择2014年的开始日期和2018年的结束日期.项目香蕉功能在所有这些年份,但苹果仅在2014年,2015年和2017年功能.所以我的最终结果将只显示香蕉的平均价格而不是苹果.

到目前为止,这是我开发的查询.我不确定如何最好地实现仅在所有搜索年份中出现的项目被平均的部分.

@sale_averages = Sale.joins(:shops,:items).where('extract(year from season_year) < ? AND extract(year from season_year) > ? ',params[:start_year],params[:end_year]).where('shops.name = ?',params[:select_shop]).select('items.name,AVG(sale.price) as price').group('shop.name')

架构

create_table "items",force: :cascade do |t| t.string "name"endcreate_table "sales",force: :cascade do |t| t.integer "shop_ID" t.integer "item_ID" t.date "season_year" t.decimal "price"endcreate_table "shops",force: :cascade do |t| t.string "name"end
解决方法 您可以检查每年有哪些项目的记录.您可以通过检查每个项目的不同年份数是否等于总年数(使用COUNT disTINCT)来实现:

number_years = params[:end_year].to_i - params[:start_year].to_i + 1 @sale_averages = Sale.joins(:shops,:items)                      .select('items.name,AVG(sale.price) as price')                      .where("EXTRACT(year from season_year) BETWEEN #{params[:start_year]} AND #{params[:end_year]}")                      .where('shops.name': params[:select_shop])                      .group('items.name')                      .having("(COUNT(disTINCT(EXTRACT(year from season_year))) = #{number_years})")

我也用BETWEEN而不是<和>.我想你想按项目名称而不是商店进行分组(就像你在原始查询中一样).

总结

以上是内存溢出为你收集整理的ruby-on-rails – Rails Postgres查询,仅选择出现在具有关联的所有搜索参数中的项目全部内容,希望文章能够帮你解决ruby-on-rails – Rails Postgres查询,仅选择出现在具有关联的所有搜索参数中的项目所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1291520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存