: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.
Đâ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. –
Cảm ơn! Tôi đã tìm kiếm điều này trong một thời gian dài! –
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} ' –