2011-12-06 34 views
0

我有一個遺留數據庫。用戶擁有多個帳戶,帳戶擁有多個用戶。有一個名爲UserAccountMapping的連接表:rails 3 has_and_belongs_to_many

===================== 
|UserID | AccountID| 
===================== 

這兩列都是var chars類型。

在Account.rb:

has_and_belongs_to_many:用戶:join_table =>:UserAccountMapping,:foreign_key =>:帳戶ID,:association_foreign_key =>:用戶ID

在User.rb:

has_and_belongs_to_many:帳戶,:join_table => 'UserAccountMapping',:foreign_key =>:用戶ID,:association_foreign_key =>:ACCOUNTID

用戶還有一個:email和:id列。用戶的主鍵是:id(它是一個整數),以及:email是一個字符串。

當我做類似User.first.accounts的事情時,連接SQL的WHERE子句將嘗試將UserAccountMapping.UserID與用戶的id相匹配,但我希望它使用用戶的:email。這可能嗎?

所以,它生成的SQL是:

選擇 「帳戶」 * FROM 「帳戶」 INNER JOIN 「UserAccountMapping」 ON 「帳戶」, 「帳戶ID」= 「UserAccountMapping」 「帳戶ID」 WHERE。 「UserAccountMapping」, 「用戶名」= 3

相反,我想這一點:

選擇 「帳戶」 * FROM 「帳戶」 INNER JOIN 「UserAccountMapping」 ON 「帳戶」, 「帳戶ID」。 =「UserAccountMapping」。「Accoun TID」 WHERE‘UserAccountMapping’,‘用戶名’=‘[email protected]

+0

你爲什麼要這麼做?嘗試設置'用戶'主鍵=>:電子郵件 – Damien

回答

1

您在這裏的結構數據的方式是讓你將要爭取得到它的抗滑軌上班。這是常規的麻煩。如果你碰到穀物,它很難實施。

使用非標準列名稱,如UserID而不是user_id會在您的應用程序中創建大量的複雜性。如果可能的話,切換到Rails風格,節省所有不必要的所有麻煩。

您還應該避免使用has_and_belongs_to_many,因爲它是來自Rails 1的遺留物,並不像Rails 2+中的has_many :through功能那樣有用。您所需要的只是連接表中的一個id主鍵列和一個關聯的模型文件,該文件設置了兩個belongs_to關係。

使用非標準id列也會引起麻煩,應該只作爲最後的手段。在大多數情況下,你可以解決這個使用UNIQUE指數該列和取景器的方法吧:

@user = User.find_by_email(email) 
@account = @user && @user.accounts.first 

如果你遵循「Rails的方式」工作的事情好了很多。學習Rails的很好的一部分是知道什麼時候玩,什麼時候以及如何在不惹麻煩的情況下壓制慣例並走自己的路。

+0

不幸的是,這是一個遺留數據庫,所以我無法更改列名遵循rails約定。我也嘗試過'has_many:through'功能,但我也有同樣的問題。 – Garrett

+0

所以,你應該考慮不使用Rails,因爲它對你來說將會非常困難和複雜。(。 – Dorian

+1

如果你真的對着牆壁,你可能想嘗試使用[Sequel](http:// sequel.rubyforge.org/)ORM而不是ActiveRecord。它往往更加靈活,因爲它沒有做太多的假設,並且可以處理非常規的鍵控安排。 – tadman