2012-10-26 38 views
0

我该如何编写这条SQL语句的'Rails方式'?将SQL转换为Rails查询

SELECT users.*, count(invitations.id) AS invitations_count 
FROM users 
LEFT OUTER JOIN invitations ON invitations.sender_id = users.id 
GROUP BY users.id 
HAVING count(invitations.sender_id) < 5 AND users.email_address NOTNULL 
ORDER BY invitations_count 

我应该使用squeel gem进行这些查询吗?

回答

1

如果你想只传送SQL这是可当您添加邀请),而不是做一个连接,每次得到它,你可以这样做:

的用户:

scope :emailable, where('users.email_address IS NOT NULL') 
scope :low_invitations, where('users.invitation_count < 5') 

然后询问用户在5邀请S和一个电子邮件地址,绝不邀请的命令:

@users = User.emailable.low_invitations.order('invitation_count asc') 

然后像访问邀请的用户:

@user.invitations 
@user.invitations.count 
etc 

针对上述情况,你就必须一个invitation_count山坳增加用户,将sender_id更改为user_id,并将一些范围添加到用户模型。你也可以使用连接来获得一个计数,而不需要有非规范化的invitation_count。

如果你要使用导轨所以可以非常容易去与这些公约不是反对他们,你可能会发现它值得设置了一个小实验性应用,并与关系打,再加上阅读协会指南:

http://guides.rubyonrails.org/association_basics.html

+0

谢谢Kenny,我最终添加了一张计数器表格,里面有我需要的所有计数器。我必须执行几个(大约15个查询)类似于上面的问题,所以如果我简单地为所有需要从不同表中计数的记录添加计数器,它会更容易(也更有效)。 – Rocky

0

您需要为Invitations和Users定义合适的模型,然后通过n * 1或n * n关系(通过belongs_to,has_many等)将它们连接起来。然后,您将能够编写能够在“隐藏”下生成此类或类似查询的代码。

使用Rails时,您必须停止思考SQL并开始思考模型,视图,控制器。

User.find_by_sql("...") 

但是,如果你遵循的轨道约定与您的命名(invitations.user_id),并存储在用户的邀请数量(和更新:

+0

我有一个用户模型和一个邀请模型,他们都有belongs_to和has_many关系。邀请引用用户两次(作为sender_id和recipient_id)。 – Rocky