0

如何以“Rails 方式”编写此 SQL 语句?

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 吗?

4

2 回答 2

1

如果您只想传输 SQL,这是可用的:

User.find_by_sql("...")

但是,如果您在命名 (invitations.user_id) 时遵循 Rails 约定,并将邀请计数存储在用户上(并在添加邀请时更新它),而不是每次都进行加入以获取它,您可以这样做:

对用户:

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

然后查询少于 5 个邀请和电子邮件地址的用户,按邀请数排序:

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

然后使用以下内容访问用户的邀请:

@user.invitations
@user.invitations.count 
etc

对于上述情况,您必须向用户添加一个invitation_count col,将sender_id 更改为user_id,并向用户模型添加一些范围。您也可以使用联接来获取计数,而无需非规范化的邀请计数。

如果您打算使用 Rails,那么遵循这些约定要比反对它们容易得多,并且您可能会发现值得设置一个小型实验性应用程序并使用关系,并阅读关联指南:

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

于 2012-10-26T18:10:49.873 回答
0

您需要为邀请和用户定义适当的模型,然后通过 n*1 或 n*n 关系(通过 belongs_to、has_many 等)连接它们。然后,您将能够编写代码来“在后台”生成这个或类似的查询。

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

于 2012-10-26T18:01:25.553 回答