2009-11-28 53 views
1

我對Rails中has_many關係的理解是它將使用JOIN來查找相關行。如果我從頭開始實現這個功能,我會創建一個關係表。我是否認爲使用JOIN會更慢?在Django中,我相信關係表是創建的,並且我知道如果需要,我可以在Rails中使用關係表。我想知道爲什麼這是默認行爲,如果它有任何不同。Rails中的has_many使用JOIN

感謝

回答

2

不,默認情況下,has_many關係使用連接查找相關行。這裏有一個快速的命令行會話,顯示了這一點(我爲我的腳本/控制檯打開了一個調試記錄器)。

$ rails has_many_test 

$ cd has_many_test 

$ ruby script/generate model account 

$ ruby script/generate model user account_id:integer 

$ rake db:migrate 

$ ruby script/console 
Loading development environment (Rails 2.3.4) 
>> Account.has_many :users 
>> a = Account.create 
    Account Create (0.4ms) INSERT INTO "accounts" ("created_at", "updated_at") VALUES('2009-11-28 18:06:50', '2009-11-28 18:06:50') 
>> a.users 
    User Load (0.3ms) SELECT * FROM "users" WHERE ("users".account_id = 1) 

但是,如果has_many關係定義:through:include選項,則SQL將導致加入,但也是正確的。

1

Rails會不會使用,如果你不告訴它這樣做的任何連接。

比方說,你有一個User模型has_many :posts

User.all 
# SELECT * FROM `users` 

User.all :joins => :posts 
# SELECT `users`.* FROM `users` INNER JOIN `posts` ON posts.user_id = users.id 

User.all :include => :posts 
# SELECT * FROM `users` 
# SELECT `posts`.* FROM `posts` WHERE (`posts`.user_id IN (1,2)) 

如果你並不需要/想加入,然後將沒有加入。

1

在ActiveRecord中(這是默認情況下在Rails中使用的ORM,但不是唯一可能的)關係通常涉及兩個模型,因此包含兩個表。因此,這些機型:

class Order < ActiveRecord::Base 
    has_many :order_items 
end 

class OrderItem < ActiveRecord::Base 
    belongs_to :order 
end 

...將引用ordersorder_items表,後者有一個foreign_key order_id引用其父秩序。

Order.find(some_id) 

將檢索單個訂單。除非明確引用它,否則不會觸及order_items,或者在您的類定義中添加指令以要求關聯始終處於導航狀態。

我不確定你爲什麼如此擔心使用連接。通過適當的索引,幾乎所有現代數據庫管理系統都將非常高效:這是他們設計的目的。

+0

謝謝。我並不十分關心它。只是好奇。我覺得這是在做一些有意義的事情。它似乎不是我在學校學習的方式。 – 2009-11-28 18:25:40