2012-02-29 5 views
20

てhas_oneの/にhas_manyのSOURCE_TYPEオプションを、ドキュメントがを理解するのに役立つ必要があります:Railsの3.1でのRailsの

「4.2.2.13を言う:SOURCE_TYPE

:SOURCE_TYPEオプションはhas_oneのためのソースの関連付けタイプを指定します:多型関連を介して行われる関連付けを通じて "

私はちょうど:sourceの説明を読んでいますが、まだsource_typeが使用されていますか?

答えて

47

:source_typeは、多型である関連付けを扱う。あなたはこのような関係を持っている場合には、言うことです:

「私のタグでタグ付けされているブックのすべてを検索:

class Tag < ActiveRecord::Base 
    has_many :taggings, :dependent => :destroy 
    has_many :books, :through => :taggings, :source => :taggable, :source_type => "Book" 
    has_many :movies, :through => :taggings, :source => :taggable, :source_type => "Movie" 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :taggable, :polymorphic => true 
    belongs_to :tag 
end 

class Book < ActiveRecord::Base 
    has_many :taggings, :as => :taggable 
    has_many :tags, :through => :taggings 
end 

class Movie < ActiveRecord::Base 
    has_many :taggings, :as => :taggable 
    has_many :tags, :through => :taggings 
end 

そして、ソースの種類は、あなたがこのようなクエリを行うことができますソースの種類がなければ「楽しい」」

tag = tag.find_by_name('Fun') 
tag.books 

という名前の、あなたがそれを行うことができないだろう、あなただけの 『楽しい』でタグ付けされたオブジェクトのコレクションを得ることができます。ソースのみを指定した場合は、オブジェクトの種類がわからないため、DB内のどのテーブルから取得するのかわからないでしょう。 source_typeは、取得しようとしているオブジェクトの種類を通知します。

これは、このブログの記事から取られる:http://www.brentmc79.com/posts/polymorphic-many-to-many-associations-in-rails

はそれがお役に立てば幸いです。

+4

これは良い説明です。同じ方法でそれを説明しているdocrailsプロジェクトにパッチを提出できますか? http://github.com/lifo/docrails。 –

+0

ありがとう!私はこれを長い間探してきました! –

+0

あなたは、関係の中でどの種類のクラスを結合するのか分からないことを意味します。それは、 'taggings.map {| link | link.taggable} ' –