2012-10-26 82 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