2013-04-15 123 views
1

我對Rails相當陌生,並且理解了連接和關聯的基礎知識,但是我對如何在一些常規查詢中最好地使用rails有一個挑戰。有很多我已經審查過的文檔,但仍然不清楚這個查詢的最佳方法。該型號如下Rails查詢關聯

用戶:

has_many :accounts 

帳戶:

belongs_to :user 
belongs_to :address, :class_name => "Location", :foreign_key => 'address_id' 

地址:

belongs_to :account (This is really a many to one relationship where an address, 
         can belong to more than one account) 

查詢是找到該用戶的所有帳戶地址。標準的SQL查詢看起來像這樣。

SELECT Users.ID AS Users_ID, Users.Username, Account.acct_name, Address.* 
FROM Address INNER JOIN (Users INNER JOIN Account ON Users.ID = Account.user_id) 
ON Address.ID = Account.address_id 
WHERE (((Users.ID)=2)); 

好像有很多力量在軌爲此沒有直接的SQL查詢。這樣做的最好方法是什麼?模型是否正確?外鍵代表是否在正確的模型中。

非常感謝您的幫助。

回答

1

您可能正在尋找has_many :through association

class User < AR::B 
    has_many :accounts 
    has_many :addresses, through: :accounts 
end 

然後,您可以查詢用戶的所有地址與@user.addresses

如果您想查看ActiveRecord爲您的查詢生成的SQL查詢,可以在查詢@user.addresses.to_sql上調用.to_sql

編輯:關於其他關聯設置,您需要重新修改Address和Account的連接方式。一種方法可能是這一個。

class Account < AR::B 
    belongs_to :user 
    belongs_to :address # the accounts table should have an address_id integer column 
end 

class Address < AR::B 
    has_many :accounts 
end 

有關可以傳遞給關聯的選項的詳細信息,請參閱Rails API Docs

+0

帳戶確實有一個address_id整數列。我假設你說外鍵表示法不是必須的,因爲它是address_id –

+0

對,如果你遵守Rails約定,在這裏指定任何額外的'foreign_key'都不是必要的。 –

+0

我想我剛剛碰到了一面牆,就像我之前嘗試過的不同架構一樣。感謝澄清這一點。 –

1

首先,根據您所描述的內容,Address類應該可能與has_many:accounts有關係,而不是belongs_to:account。一般的經驗法則是當belongs_to表的模型表中有外鍵時使用belongs_to。但是對於這個查詢來說,這無關緊要,因爲你是從用戶開始的。

像這樣的東西應該是接近你想要什麼:

User.where(:id => 2).includes(:accounts => :addresses) 

更多信息,請參見Rails guide。 squeel gem對於更高級的查詢功能也很有用。

+0

感謝您的回覆。如果我達到15歲,我會投票迴應。感謝squeel gem的提示。我會看看它。 –