组方法仅显示一个参数

时间:2014-02-11 23:20:02

标签: mysql ruby-on-rails

在我的控制器中我有:

@comparison = Result.group('results.trial_id').having('COUNT(results.variety_id) = 2').where('results.variety_id' => [params[:variety_one], params[:variety_two]]).
joins(:trial).where('trials.irrigated' => params[:irrigated], 'trials.year' => params[:year]).joins(:regions).where('sites.region_id' => params[:regions])

当我在视图中检查@comparison时,它只显示params [:variety_two]的结果,即variety_id:2255而不是params [:variety_one]。这是为什么?

视野中的输出

[#<Result id: 275428, trial_id: 1038, created_at: "2014-01-29 04:42:43", updated_at: "2014-01-29 04:42:43", variety_id: 2255, year: 2009, lint: 1559.0, turnout: 41>>]

所以它也应该列出params [:variety_one],它也是variety_id:2246。

SQL

SELECT DISTINCT results.year FROM `results` INNER JOIN `trials` ON `trials`.`trial_id` = `results`.`trial_id` INNER JOIN `trials` `trials_results_join` ON `trials_results_join`.`trial_id` = `results`.`trial_id` INNER JOIN `sites` ON `sites`.`site_id` = `trials_results_join`.`site_id` INNER JOIN `regions` ON `regions`.`region_id` = `sites`.`region_id` WHERE `results`.`variety_id` IN (2246, 2255) AND `trials`.`irrigated` IN (2) AND `trials`.`year` IN ('2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013') AND `sites`.`region_id` IN (1, 2, 3, 4, 5, 6, 7, 8) AND `results`.`year` IN (2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013) GROUP BY results.trial_id HAVING COUNT(results.variety_id) = 2

1 个答案:

答案 0 :(得分:1)

免责声明:我们一直在线下聊聊这个,这是我认为你想要的:

您希望获得与您的参数匹配的试验的所有ID,并具有这两个品种, 然后得到那些具有这两个品种的试验的所有结果?

这样的事情(我确信这不是最优雅的方式,可以整理一下):

@trial_ids = Result.where(:variety_id => [params[:variety_one], params[:variety_two]]).group(:trial_id).having('COUNT(*) = 2').count.keys

@filtered_trials = Trial.where(:trial_id => [@trial_ids]).where('trials.irrigated' => params[:irrigated], 'trials.year' => params[:year]).joins(:regions).where('sites.region_id' => params[:regions])

@all = Result.where(:trial_id => [@filtered_trials.map {|x| x.trial_id}]).where(variety_id: [params[:variety_one], params[:variety_two]]).select('AVG(lint) AS lint, AVG(turnout) AS turnout')