2013-02-12 26 views
0

我的印象是,Rails不應該在數據庫中定義任何依賴關係,而只是使用has_many和belongs_to來定義關係。但是,我正在通過導軌指南,它具有以下內容。Rails理論 - 無數據庫依賴關係?

class CreateComments < ActiveRecord::Migration 
    def change 
    create_table :comments do |t| 
     t.string :commenter 
     t.text :body 
     t.references :post 

     t.timestamps 
    end 

    add_index :comments, :post_id 
    end 
end 

我以爲這樣不好... ...?我試圖做一些類似於註釋字段的事情,每次調用show方法時都會創建一個新實例,但是我認爲沒有這些「引用」和「add_index」,它不會將post_id存儲在註釋行中。

+0

有一個很好的消滅這個所有軟件截屏 - https://www.destroyallsoftware.com/screencasts/catalog/where-correctness-is-enforced – 2013-02-12 20:46:34

回答

1

所有這些遷移的作用是創造POST_ID並告訴它應該索引此列(提高性能)數據庫

t.references :post是基本相同t.integer :post_id所以,是的,它是存儲在註釋中POST_ID。你仍然需要在模型中定義你的關係。

+0

好吧,我通常只是做't.integer:POST_ID '手動。我想add_index更多的是我所問的,因爲我從來沒有真正使用過,我的關係仍然有效。 – jake 2013-02-12 20:55:03

+0

你不需要使用add_index,但是如果你不這樣做,那麼像'SELECT * FROM comments WHERE post_id = 1'這樣的查詢將會很慢,因爲它必須執行一個完整的tablescan才能找到post_id等於1的每一行。添加索引避免了tablescans並提高了性能,因爲它可以使用更多優化的方法來查找行post_id = 1 – Tomdarkness 2013-02-12 20:59:33

+0

啊,這很有道理。所以我錯誤的post_id可能是其他地方,如果它真的是一個優化的東西,是嗎? – jake 2013-02-12 21:02:32

0

你在哲學上實際上是錯誤的。

Rails魔術很好,只有在實際的外鍵支持DB級時。

The docs清楚地說明這

Rails的魔術進來,當你已經正確命名你的外鍵,以便它可以使用慣例找出關聯。

+0

如果Tomdarkness是對的,我實際上更多地指的是add_index,它看起來並不在該頁面上的任何地方。 – jake 2013-02-12 20:55:31

+0

沒錯,'add_index'確實非常需要。你將需要**模型中的關係**和在表中正確命名的外鍵。對於實際情況,外鍵索引也是需要的,但是rails不會生成這個索引。愚蠢的,我同意 – Arindam 2013-02-12 20:58:35

0

在ORM中表達關係有什麼問題,這就是它應該完成的地方。我相信你會在數據庫供應商的具體情況(如外鍵約束和關係)之間混淆。


class Comment < ActiveRecord::Base 
    attr_accessible :post, :post_id 
    belongs_to :post 
end 

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class CommentsController < ApplicationController 
    def create 
    @comment = Comment.create(params[:comment]) # where params[:comment] = {post_id: 1, message: ''} 
    @post = comment.post 
    respond_with(@comment) 
    end 
end 
+0

我正在談論具體的軌道遷移。我總是在我的模型中定義我的關係,但是我沒有在數據庫中定義它們,就像上面的'add_index'一樣。 – jake 2013-02-12 20:58:33