Ram*_*amy 5 ruby-on-rails ruby-on-rails-4
所以,我在纯 sql 中按照我想要的方式工作:
select * from clients c
join insurance_providers p on c.id = p.client_id
where p.effective_on =
(select max(effective_on)
from insurance_providers group by client_id having p.client_id = client_id)
and user_id = 2; #user_id =2 where 2 represents current_user.id
Run Code Online (Sandbox Code Playgroud)
这是我在控制台中尝试过的:
Client.joins(:insurance_providers)
.select('max(insurance_providers.effective_on)')
.group(:client_id)
.where('user_id = 2')
Run Code Online (Sandbox Code Playgroud)
它立即在我的脸上爆炸:
NoMethodError:2013 年 7 月 8 日星期一的未定义方法“组”:日期
看起来我只是从 select 语句返回日期本身。我需要类似的东西"where effective_on = .select('max..."
任何帮助将不胜感激。
更新:我越来越接近这个:
InsuranceProvider.maximum(:effective_on, :group => 'client_id')
Run Code Online (Sandbox Code Playgroud)
但我不确定如何加入客户表以获取我需要的所有信息。在 rails 控制台中,这两个:
Client.joins(:insurance_providers).maximum(:effective_on, :group => 'client_id')
Client.joins(:insurance_providers.maximum(:effective_on, :group => 'client_id'))
Run Code Online (Sandbox Code Playgroud)
导致此错误:
NoMethodError:2013 年 7 月 8 日星期一的未定义方法“组”:日期
更新:
这更接近,但我需要在最后有一个子句 - 只是不确定如何将内表和外表联系在一起(如在 sql 中:p.client_id = client_id):
insuranceProvider = InsuranceProvider.where("effective_on = (SELECT MAX(effective_on) FROM insurance_providers group by client_id)")
InsuranceProvider Load (1.0ms) SELECT "insurance_providers".* FROM "insurance_providers" WHERE (effective_on = (SELECT MAX(effective_on) FROM insurance_providers group by client_id))
PG::CardinalityViolation: ERROR: more than one row returned by a subquery used as an expression
: SELECT "insurance_providers".* FROM "insurance_providers" WHERE (effective_on = (SELECT MAX(effective_on) FROM insurance_providers group by client_id))
ActiveRecord::StatementInvalid: PG::CardinalityViolation: ERROR: more than one row returned by a subquery used as an expression
: SELECT "insurance_providers".* FROM "insurance_providers" WHERE (effective_on = (SELECT MAX(effective_on) FROM insurance_providers group by client_id))
Run Code Online (Sandbox Code Playgroud)
更新:这里有一些进展。这似乎是我需要的,但我不知道如何将它加入到客户端表中:
InsuranceProvider.where("effective_on = (SELECT MAX(effective_on) FROM insurance_providers p group by client_id having p.client_id = insurance_providers.client_id)")
Run Code Online (Sandbox Code Playgroud)
这给了我由 client_id 分组的 insurance_providers。我需要在 client_id 上加入这个结果集。
这不起作用:
InsuranceProvider.where("effective_on = (SELECT MAX(effective_on) FROM insurance_providers p group by client_id having p.client_id = insurance_providers.client_id)").client
Run Code Online (Sandbox Code Playgroud)
导致“NoMethodError”:
undefined method `client' for #<ActiveRecord::Relation::ActiveRecord_Relation_InsuranceProvider:0x007fe987725790>
Run Code Online (Sandbox Code Playgroud)
更新:
这让我得到了我需要的客户!
Client.joins(:insurance_providers).where("insurance_providers.effective_on = (SELECT MAX(effective_on) FROM insurance_providers p group by client_id with p.client_id = insurance_providers.client_id)")
但是我无法访问 insurance_providers 表。啊!这越来越粘了......
更新:
client.insurance_providers.order('effective_on DESC').first.copay
Run Code Online (Sandbox Code Playgroud)
有时您只需要休息一下。
所以,在我的控制器中,我有这个:
@clients = Client.joins(:insurance_providers)
.where("insurance_providers.effective_on = (
SELECT MAX(effective_on)
FROM insurance_providers p
GROUP BY client_id
HAVING p.client_id = insurance_providers.client_id
)")
Run Code Online (Sandbox Code Playgroud)
然后在我看来,我有这样的:
client.insurance_providers.order('effective_on DESC').first.copay
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8728 次 |
| 最近记录: |