25

Tôi khá mới đối với Rails và tôi đang cố gắng thực hiện mối quan hệ HABTM đa hình. Vấn đề là tôi có ba mô hình mà tôi muốn liên hệ.Mối quan hệ đa hình HABTM

Mô hình đầu tiên là mô hình Sự kiện và sau đó là hai loại người tham dự: Người dùng và Danh sách liên hệ.

Điều tôi muốn làm là liên hệ với tư cách người tham dự cả người dùng và người liên hệ. Vì vậy, những gì tôi có ngay bây giờ trong mã của tôi là:

Event Mẫu

has_and_belongs_to_many :attendees, :polymorphic => true 

tài khoản Mẫu

has_and_belongs_to_many :events, :as => :attendees 

Liên hệ Mẫu

has_and_belongs_to_may :events, :as => :attendees 
  1. Cách di chuyển bảng HABTM cần phải như thế nào? Tôi là một chút bối rối và tôi đã tìm thấy không có sự giúp đỡ về điều đó.
  2. Nó có hoạt động không?

Trả lời

61

Không, bạn không thể làm điều đó, không có điều gì như liên kết has_and_belongs_to_many đa hình.

Điều bạn có thể làm là tạo mô hình ở giữa. Nó có lẽ sẽ là một cái gì đó như thế này:

class Subscription < ActiveRecord::Base 
    belongs_to :attendee, :polymorphic => true 
    belongs_to :event 
end 

class Event < ActiveRecord::Base 
    has_many :subscriptions 
end 

class User < ActiveRecord::Base 
    has_many :subscriptions, :as => :attendee 
    has_many :events, :through => :subscriptions 
end 

class Contact < ActiveRecord::Base 
    has_many :subscriptions, :as => :attendee 
    has_many :events, :through => :subscriptions 
end 

Bằng cách này, mô hình đăng ký hoạt động như các bảng liên kết trong một N: N mối quan hệ nhưng cho phép bạn có hành vi đa hình để các tổ chức sự kiện.

0

Resolveu parcialmente.

Nó giải quyết vấn đề với khung mà chúng tôi có theo ý của mình, nhưng nó bổ sung thêm sự phức tạp và mã "không cần thiết". Bằng cách tạo ra một mô hình trung gian (mà tôi sẽ gọi B), và cho A -> B -> C là "A has_many B's has_many C's", chúng ta có một Mô hình AR khác sẽ nạp thêm một lớp AR vào bộ nhớ khi nó được nạp và sẽ khởi tạo cho mục đích duy nhất là đạt được các cá thể C. Bạn luôn có thể nói, nếu bạn sử dụng: thông qua liên kết, bạn không tải các hiệp hội B, nhưng sau đó bạn sẽ được trái với một mô hình thậm chí còn lỗi thời hơn, mà sẽ chỉ có để xem đoàn caravan đi qua.

Thực tế, đây có thể là một tính năng bị thiếu trong Bản ghi đang hoạt động. Tôi sẽ đề xuất nó như là một tính năng để thêm, vì nó đã được nguyên nhân của mối quan tâm cho bản thân mình (đó là cách tôi đã hạ cánh trong bài này hy vọng sẽ tìm thấy một giải pháp :)).

Cumprimentos

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