2012-02-23 118 views
18

我的意思是,如果我有兩個模型,通過has_and_belongs_to_many關聯連接,我可以將其他數據存儲在每個關聯的連接表中嗎?也就是說,額外的數據不會是任何表中的單個記錄的一部分,而是它們之間的連接。Rails:是否可以向has_and_belongs_to_many關聯添加額外的屬性?

我的實際型號如下:

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 

因此,問題是,每個部分在許多封裝,每包有不同的部分。我想補充的是一個數量。這不是每個零件的數量,而是每個零件的每個包裝的數量。

我找不到在ActiveRecord中如何做到這一點。如果我沒有使用rails/activerecord,我只需將數量列添加到與零件相關的連接表中。我顯然可以在遷移中進行此更改,但是如何使用ActiveRecord訪問該值?

回答

25

簡短的回答不,你不能與HABTM的關係。它僅用於簡單的多對多關係。

您將需要使用has_many:through關係。在這種情況下,您將創建一個聯接模型(PartPackage),您可以在其中定義所需的額外屬性。

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

has_many :throughhas_and_belongs_to_many之間的關鍵區別了Rails指南詳細地解釋了這兩個選項之間的差異,但是如果你想添加描述關係的數據,然後使用has_many :through,您可以訪問模型加入這兩個。

這是HAS_MANY:通過模樣: Credit to the Rails guide.

+0

你用什麼程序來製作這麼好的輪廓? – MicFin 2016-06-01 19:21:33

+0

(我的內部編號#485)如何在創建整個記錄的同時更新appointment_date,以及以後如何讀取額外的屬性?我只能通過Appointment.find_by完成,但我希望像patient.appointments.first.appointment_date – ace 2016-10-01 11:59:54

+0

這樣的東西不那麼古怪您可以更新這樣的appointment_date屬性:belongs_to:physician ,:touch =>:appointment_date。 – hashrocket 2017-05-17 18:12:10

0

其實,這是可能的。

1)添加量的關鍵packages_parts連接表

2)添加到您的零件模型

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

現在你可以做part.packages[0].quantity,例如。

這樣做是告訴Rails在獲取特定部件的包時獲取數量鍵。

(你可以做你的包型號相同的,如果你想要做package.parts.first.quantity以及 - 只是把這個包裝上的型號也與「零件」取代「包」)

更多信息:https://ducktypelabs.com/using-scope-with-associations/

相關問題