18

私は、has_and_belongs_to_manyアソシエーションで接続された2つのモデルがある場合、それぞれのアソシエーションのために他のデータをジョインテーブルに保存できますか?つまり、余分なデータはどちらかのテーブルの単一のレコードの一部ではなく、それらの間の接続の代わりになります。次のように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

Railsのガイドは、より詳細に2つのオプションの違いについて説明しhas_many :throughhas_and_belongs_to_manyの主な違いは、あなたが関係を記述したデータを追加したい場合はしかし、その後has_many :throughを使用して、モデルにアクセスすることができ、ありますそれは2人に加わる。

は、これは何にhas_manyです:のように見えて: Credit to the Rails guide.

+0

このような素敵な概要を作成するためにどのようなプログラムを使用しましたか? – MicFin

+0

(私の社内リファレンス#485)レコード全体が作成されるのと同時に、どのように予定を更新するのですか?また、余分な属性を後でどのように読みますか?私はAppointment.find_byを介してのみ行うことができます.............しかし、私はpatient.appointments.first.appointment_dateのような不気味なものを望みます – ace

+0

あなたはこのようにappointment_date属性を更新できます:belongs_to:physician 、:touch =>:appointment_date。 – hashrocket

0

実は、これは可能です。

1)packages_partsに数量キーを追加し、テーブル

2に参加する)今、あなたは、たとえば、part.packages[0].quantityを行うことができます

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

あなたのパーツモデルにこれを追加します。

これは、特定のパーツのパッケージを取得するたびに数量キーをフェッチするように指示します。

(あなたにもpackage.parts.first.quantityを行いたい場合は、あなたのパッケージモデルに同じことを行うことができます - ちょうど「部」と「パッケージ」を交換し、また、パッケージのモデルでこれを置く)

詳細情報:https://ducktypelabs.com/using-scope-with-associations/

関連する問題