2012-02-23 26 views
18

Ý của tôi là nếu tôi có hai mô hình, được kết nối bởi một liên kết has_and_belongs_to_many, tôi có thể lưu trữ dữ liệu khác trong bảng kết nối cho mỗi liên kết không? Tức là, dữ liệu bổ sung sẽ không là một phần của một bản ghi duy nhất trong cả hai bảng, nhưng thay vì kết nối giữa chúng.Đường ray: có thể thêm thuộc tính bổ sung vào liên kết has_and_belongs_to_many không?

mô hình thực tế của tôi là như sau:

class Part < ActiveRecord::Base 
    has_and_belongs_to_many :assemblies 
    has_and_belongs_to_many :packages 
    belongs_to :user 

    validates :name, :user_id, :presence => true 
end 

class Package < ActiveRecord::Base 
    has_and_belongs_to_many :parts 
    belongs_to :user 
end 

Vì vậy, vấn đề là mỗi phần có sẵn trong nhiều gói, và mỗi gói có phần khác nhau. Những gì tôi muốn thêm là một số lượng. Đó sẽ không phải là số lượng của mỗi phần, nhưng mỗi gói của mỗi phần.

Tôi không thể tìm thấy cách thực hiện việc này trong ActiveRecord. Nếu tôi không sử dụng đường ray/activerecord, tôi chỉ cần thêm một cột số lượng vào bảng nối kết liên quan đến các phần cho các gói. Tôi rõ ràng có thể thực hiện thay đổi này trong quá trình di chuyển, nhưng làm cách nào để truy cập giá trị bằng ActiveRecord?

Trả lời

25

Câu trả lời ngắn gọn không bạn không thể có mối quan hệ HABTM. Nó chỉ dành cho nhiều mối quan hệ đơn giản.

Bạn sẽ cần sử dụng mối quan hệ has_many: through. Trong trường hợp này, bạn sẽ tạo ra một mô hình tham gia (PartPackage), nơi bạn có thể xác định các thuộc tính bổ sung mà bạn cần.

class Part < ActiveRecord::Base 
    has_many :part_packages 
    has_many :packages, :through => :part_packages 

    has_and_belongs_to_many :assemblies 
    belongs_to :user 

    validates :name, :user_id, :presence => true 
end 

class PartPackage < ActiveRecord::Base 
    belongs_to :part 
    belongs_to :package 
end 

class Package < ActiveRecord::Base 
    has_many :part_packages 
    has_many :parts, :through => :part_packages 
    belongs_to :user 
end 
14

Có một sự khác biệt quan trọng giữa has_many :throughhas_and_belongs_to_many hướng dẫn Rails giải thích sự khác biệt giữa hai lựa chọn chi tiết hơn, tuy nhiên nếu bạn muốn thêm dữ liệu mô tả các mối quan hệ sau đó sử dụng has_many :through và bạn có thể truy cập vào các mô hình tham gia hai.

Đây là những gì has_many: thông qua vẻ bề ngoài như: Credit to the Rails guide.

+0

Bạn đã sử dụng chương trình nào để tạo một phác thảo đẹp như vậy? – MicFin

+0

(ref nội bộ của tôi # 485) Làm thế nào để bạn cập nhật date_date cùng một lúc toàn bộ hồ sơ được tạo ra và cũng làm thế nào để bạn đọc thuộc tính thêm sau này? Tôi chỉ có thể làm điều đó thông qua Appointment.find_by ............. nhưng tôi muốn một cái gì đó ít wacky như patient.appointments.first.appointment_date – ace

+0

Bạn có thể cập nhật thuộc tính appoint_date như thế này: depends_to: physician ,: touch =>: appoint_date. – hashrocket

0

Trên thực tế, điều này là có thể.

1) Thêm một khóa lượng đến packages_parts tham gia bảng

2) Thêm phần này vào mô hình Phần của bạn

has_and_belongs_to_many :packages, -> { select("packages.*, 
packages_parts.quantity") } 

Bây giờ bạn có thể làm part.packages[0].quantity, ví dụ.

Điều này làm cho Rails tìm nạp khóa số lượng bất cứ khi nào nó nhận được gói cho một phần cụ thể.

(Bạn có thể làm tương tự cho mô hình trọn gói của bạn nếu bạn muốn làm package.parts.first.quantity cũng - chỉ cần đặt này trên mô hình trọn gói cũng có, thay thế 'gói' với 'bộ phận')

Thông tin khác: https://ducktypelabs.com/using-scope-with-associations/

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