6

Feeds と Posts という 2 つのエンティティ間に has_many 関係があります。特定の種類の投稿、ビデオ、写真もあります。これは、単一テーブル継承を使用してデータベース内で構造化されます。

現在、フィードと投稿 (サブタイプを含む) の間の has_many 関係を指定するフィード モデルがあります。

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

これを指定するためのより良い、より従来の方法はありますか? それとも、私が持っているものは可能な限り単純ですか?

4

3 に答える 3

5

私があなたを正しく理解しているなら、あなたは投稿を持っています、そして投稿はビデオか写真のどちらかです。Jarylが言ったように、あなたが持っているものはおそらく理解/処理するのが最も簡単ですが、空想を得たい場合は、単一テーブル継承またはポリモフィックアソシエーションを使用できます。

STI-例(Rails 3rd Editionを使用したアジャイルWeb開発から)

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

したがって、顧客を作成する場合

Customer.create(:name => 'John Doe', :email => 'john@doe.com', :balance => 78.29)

その後、人を介してそれを見つけることができます

x = Person.find_by_name('John Doe')
x.class #=> Customer
x.email #=> john@doe.com
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テーブルの文字列:typeを忘れないでください

于 2009-06-02T14:03:20.227 に答える
2

これは、実行できる最も簡単な方法です。

写真をビデオと同じように扱うことができれば、おそらく STI を廃止し、名前付きスコープを使用してさまざまな種類のコンテンツへのアクセサーを提供できます。

于 2009-05-21T19:19:24.667 に答える
0

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

また、後でSTIをリッピングして、フィードモデルのコードを1ビット変更せずに、:photosと:videosをそれぞれの個別のテーブルに分割することもできます。スコア!

于 2009-07-08T04:46:59.060 に答える