2009-05-20 10 views
6

私は2つのエンティティ、フィードと投稿の間にhas_many関係を持っています。私は特定のタイプの投稿、ビデオ、写真も持っています。これは、単一のテーブル継承を使用してデータベース内で構造化されています。has_manyと単一のテーブル継承

は今、私は私のフィードモデルは

class Feed < ActiveRecord::Base 
    has_many :posts 
    has_many :photos 
    has_many :videos 

は、これを指定するためのより良い、より多くの従来の方法はあります(サブタイプを含む)フィードとポストの間にhas_manyの関係を規定していますか?それとも、私が得ることができるほどシンプルなものですか?

答えて

4

あなたが正しくあなたを理解している場合、投稿と投稿は動画または写真のいずれかになります。 Jaryl氏はあなたが持っているものはおそらく理解しやすい/扱いやすいと言っていますが、単なる表の継承やポリモフィックな関連付けを使用することができればと思っています。

STI - 例(アジャイルウェブ開発のレールと第3版)ですから、あなたが人を経由してそれを見つけることができます

Customer.create(:name => 'John Doe', :email => '[email protected]', :balance => 78.29) 

顧客を作成する場合

create_table :people, :force => true do |t| 
    t.string :type 

    #common attributes 
    t.string :name 
    t.string :email 

    #attributes for type=Customer 
    t.decimal :balance, :precision => 10, :scale => 2 

    #attributes for type=Employee 
    t.integer :reports_to 
    t.integer :dept 

    #attributes for type=Manager 
    #none 
end 

class Person < ActiveRecord::Base 
end 

class Customer < Person 
end 

class Employee < Person 
    belongs_to :boss, :class_name => "Manager", :foreign_key => :reports_to 
end 

class Manager < Person 
end 

x = Person.find_by_name('John Doe') 
x.class #=> Customer 
x.email #=> [email protected] 
x.balance #=> 78.29 
x.some_customer_class_method # will work because the Person.find method returned a Customer object 

あなたが持つことができるので

class Post < ActiveRecord::Base 
end 
class Photo < Post 
end 
class Video < Post 
end 

、その後、あなたはPost.allによってそれらすべてを見つけることができるが、(あなたが写真や動画ではありませんポストを持っている場合は、ポストオブジェクト)を使用すると、写真とビデオオブジェクトを取り戻すだろう

を忘れないでください文字列:dbテーブルに入力してください

+1

http://stackoverflow.com/questions/3231889/rails-sti-with-inheriting-children私は、STIを子オブジェクトにする方法を理解しようとしています。したがって、与えられた例では、 Person belongs_to:company "と" Company has_many:persons "のどちらかですか? – Rabbott

1

これはあなたができる最も簡単な方法です。

もし、写真をビデオと同じように扱えるのであれば、STIをやめて、名前付きスコープを使ってさまざまな種類のコンテンツにアクセサーを提供することができます。

0

私はこの質問の例が得られるほど単純であることに同意します。すでにSTIを使用しており、関連を明示しています。

さらに、Feedモデルのコードを1ビット変更することなく、STIを後で取り除き、photos:およびvideosを自分の別のテーブルに分割することができます。スコア!

関連する問題