2012-02-29 38 views

Trả lời

47

:source_type đề với các liên kết có tính đa hình. Đó là để nói, nếu bạn có một mối quan hệ như thế này:

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 

Sau đó, các loại nguồn cho phép bạn thực hiện các truy vấn như thế này:

"Tìm cho tôi tất cả những cuốn sách đã được gắn thẻ với thẻ có tên 'Fun' "

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

Nếu không có loại nguồn, bạn sẽ không thể làm điều đó, bạn chỉ có thể nhận được một tập hợp các đối tượng được gắn thẻ 'Fun'. Nếu bạn chỉ xác định nguồn, nó sẽ không biết loại đối tượng nào là lớp, vì vậy bạn sẽ không biết bảng nào trong DB sẽ lấy từ đó. source_type Thông báo cho loại đối tượng bạn đang cố gắng truy xuất.

Điều này được lấy từ bài đăng trên blog này: http://www.brentmc79.com/posts/polymorphic-many-to-many-associations-in-rails

Hy vọng điều đó sẽ hữu ích.

+4

Đây là giải thích tốt. Bạn có thể gửi một bản vá cho dự án docrails giải thích nó theo cùng một cách không? http://github.com/lifo/docrails. –

+0

Cảm ơn! Tôi đã tìm kiếm điều này trong một thời gian dài! –

+0

Bạn có nghĩa là nó sẽ không biết loại lớp cho một tham gia trong một mối quan hệ. Nó sẽ tìm ra loại lớp từ 'taggings.map {| link | link.taggable} ' –

Các vấn đề liên quan