2016-11-04 5 views
0

私はRubyレベルで何が起こっているのか理解していますが、モデルがそれ自身のテーブルの外部キーとして表現されている場合、「コメントは多くのコメントを持つことができます」というように、私の質問が不明な場合はお詫び申し上げます。すべての回答は大変ありがとうございます。多態性関連でSQL側で実行中のアクティブレコードは何ですか?

class CreateComments < ActiveRecord::Migration 
    def change 
    create_table :comments do |t| 
     t.string :content, {null: false} 
     t.integer :commentable_id, {null: false} 
     t.string :commentable_type, {null: false} 
     t.references :commenter, null: false 

     t.timestamps(null: false) 
    end 
    end 
end 
+0

ここでは、「comments」というデータベーステーブルが1つだけ生成されます。 "SQLテーブル"はどういう意味ですか? –

答えて

0

すなわち第一に、あなたの移行では、多型を使用することができます:本当作成します多型参照:

class CreateComments < ActiveRecord::Migration 
    def change 
    create_table :comments do |t| 
     t.string :content, {null: false} 
     t.references :commentable, polymorphic: true, index: true 
     t.references :commenter, null: false 

     t.timestamps(null: false) 
    end 
    end 
end 

あなたが既に決定したように、この多態的な関連付けを表すコメントテーブルに:commentable_id:commentable_typeという列を生成するだけです - 特別なテーブルや他の魔法は起こりません。

commentable_type列は、行belongs_toのモデルの名前を格納する単なる文字列です。 commentable_idは、当然この多型関連に関連するモデルインスタンスのidを保持する整数です。

しかし、フードの下で何が起こっているのかを実際に調べたい場合は、データベースに接続して、自分が持っているものを見てください。

あなたは(あなたがpsqlを使用してデータベースに接続していると仮定した場合)始めるためにいくつかの便利なコマンド:

\dt(TABLESを表示するために相当)

\d+ tablename(DESCのテーブル名に相当 - テーブル名が名前であります

+0

ありがとうございました!本当に役に立ちました:D –

+0

喜んで助けになる - 私はあなたの質問に答えることができますあなたが投票をしてください/受け入れる:) – David

0

Active Recordはそれconstantizecommentable_type列を使用し、commentable_idで関連するレコードを検索:

commentable_type = "Post" # for example 
commentable_type.constantize # returns the Post class model 
commentable_type.constantize.find commentable_id # find the Post record 

# the above line is equivalent to: 
Post.find commentable_id 
関連する問題