我對Rails中has_many關係的理解是它將使用JOIN來查找相關行。如果我從頭開始實現這個功能,我會創建一個關係表。我是否認爲使用JOIN會更慢?在Django中,我相信關係表是創建的,並且我知道如果需要,我可以在Rails中使用關係表。我想知道爲什麼這是默認行爲,如果它有任何不同。Rails中的has_many使用JOIN
感謝
我對Rails中has_many關係的理解是它將使用JOIN來查找相關行。如果我從頭開始實現這個功能,我會創建一個關係表。我是否認爲使用JOIN會更慢?在Django中,我相信關係表是創建的,並且我知道如果需要,我可以在Rails中使用關係表。我想知道爲什麼這是默認行爲,如果它有任何不同。Rails中的has_many使用JOIN
感謝
不,默認情況下,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將導致加入,但也是正確的。
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))
如果你並不需要/想加入,然後將沒有加入。
在ActiveRecord中(這是默認情況下在Rails中使用的ORM,但不是唯一可能的)關係通常涉及兩個模型,因此包含兩個表。因此,這些機型:
class Order < ActiveRecord::Base
has_many :order_items
end
class OrderItem < ActiveRecord::Base
belongs_to :order
end
...將引用orders
和order_items
表,後者有一個foreign_key order_id
引用其父秩序。
Order.find(some_id)
將檢索單個訂單。除非明確引用它,否則不會觸及order_items
,或者在您的類定義中添加指令以要求關聯始終處於導航狀態。
我不確定你爲什麼如此擔心使用連接。通過適當的索引,幾乎所有現代數據庫管理系統都將非常高效:這是他們設計的目的。
謝謝。我並不十分關心它。只是好奇。我覺得這是在做一些有意義的事情。它似乎不是我在學校學習的方式。 – 2009-11-28 18:25:40