Sql 具有多个联接和记录查找的Rails作用域
我有客户、交易和交易类型模型。 客户有很多交易。Deal属于DealType。DealType具有属性-正在关闭。 我需要选择所有尚未完成交易的客户 类似于scope:active、>{where'deals.last.deal_type.closing=?',false}这当然是不正确的 如何在Rails 4中以最佳方式完成此任务 ps.如果您能链接到了解rails sql查询的源代码,将不胜感激。试试看Sql 具有多个联接和记录查找的Rails作用域,sql,ruby-on-rails,scope,ruby-on-rails-4,Sql,Ruby On Rails,Scope,Ruby On Rails 4,我有客户、交易和交易类型模型。 客户有很多交易。Deal属于DealType。DealType具有属性-正在关闭。 我需要选择所有尚未完成交易的客户 类似于scope:active、>{where'deals.last.deal_type.closing=?',false}这当然是不正确的 如何在Rails 4中以最佳方式完成此任务 ps.如果您能链接到了解rails sql查询的源代码,将不胜感激。试试看 joins(deals: :deal_type).where('deal_types.c
joins(deals: :deal_type).where('deal_types.closing = ?', false)
一本好书:
特别是:
如果您不介意在原始SQL中执行此操作,请尝试:
SELECT clients.*,deals.* FROM clients INNER JOIN deals ON clients.id=deals.client_id
INNER JOIN
(
SELECT deals.client_id, MAX(deals.created_at) AS latest_deals_date
FROM deals
GROUP BY deals.client_id
) latest_deals
ON (deals.client_id=latest_deals.client_id AND deals.created_at>=latest_deals.latest_deals_date)
INNER JOIN deal_types ON deals.deal_type_id=deal_types.id
WHERE deal_types.closing=false;
谢谢这几乎是我想要的,但我只需要检查最后一个客户的id或日期:啊,你的要求和我的类似。我是用SQL完成的,但还没有找到ActiveRecord的方法。我的问题是:添加到@jcm。我找不到完整的活动记录解决方案。但是我们可以这样做:scope::active、>{joinsdels::deal\u type.joinsiner加入选择deals.client\u id,MAXdeals.created\u at AS latest\u deals\u date FROM deals GROUP BY deals.client\u id latest\u deals ON deals.client\u id=latest\u deals.client\u id AND deals.created\u at>=latest\u deals\u deals\u date.where'deals'deals\u type.closing=?,false}@是的,看起来内部查询确实需要在SQL中完成。