2017-11-05 9 views
1

私はUserMeetOptionテーブルを持っています。これは、多対多の関係である、と私はcreate_join_tableコマンドを使用してテーブルを結合を作成することができた。私はまた、作成したRails 5:モデルなしでテーブルを結合するレコードを追加する(has_and_belongs_to_many)

class CreateJoinTableUsersMeetOptions < ActiveRecord::Migration[5.0] 
    def change 
    create_join_table :users, :meet_options do |t| 
     # t.index [:user_id, :meet_option_id] 
     # t.index [:meet_option_id, :user_id] 
    end 
    end 
end 

:これは、移行ファイルを生成rails g migration CreateJoinTableUsersMeetOptions users meet_options

使用してユーザとmeet_optionモデルとの間の関連has_and_belongs_to_many

class User < ActiveRecord::Base 
    has_and_belongs_to_many :meet_options 
#More codes below 
end 

class MeetOption < ApplicationRecord 
    has_and_belongs_to_many :users 
end 

この関連付けはうまくいきます。例えば、Railsコンソールでuser.meet_optionsを照会することができます。

私の質問は:結合されたMeetOptionsUsersテーブルのモデルはありません。どうすればレコードを追加できますか?現在、GUIデータベースソフトウェア(Postico)を使用して手動で行を追加する必要があります(user_id = 1; meet_option_id = 2)。

ActiveRecordモデルが関連付けられている場合と同様に、MeetOptionUser.create(user_id: 1, meet_option_id: 2)などのレコードをRailsコンソールに追加する方法はありますか?

答えて

1

has_and_belongs_to_manyの関係では、通常のアクティブレコードの関連付け方法を使用してUsersMeetOptionsをリンクする必要があります。ジョイン・テーブルを直接操作する必要はありません。 Railsはそれをあなたのために処理します。 Ruby on Rails Guide has_and_belongs_to_many Association Referenceには、この関連付けによって自動的に作成された便利なメソッドがすべてリストされています。

有用な方法がいくつかあります。

collection<<(object,..)は、1つ以上のオブジェクトを結合テーブルに追加します。例えば:

@user.meet_options << @meet_option 

結合テーブル内の適切なエントリを追加することにより、@userと上記の関連付ける@meet_optionレコード。この場合、user_id: @user.idmeet_option_id: @meet_option.idのレコードが結合テーブルに追加されます。逆は同じことを達成する:

@meet_option.users << @user 

もう1つの有用な方法はcollection.delete(object,...)です。これにより、結合表から関連を削除できます。関連するオブジェクトは削除されません。例えば:

@user.meet_options.delete @meet_option 

は、上記結合テーブルから該当するレコードを削除することにより、@user@meet_option間の関連付けを削除します。ただし、usersテーブルから@userを削除したり、meet_optionsテーブルから@meet_optionを削除したりすることはありません。

collection.destroy(object,...)は、collection.delete(object,...)とほぼ同じものです。

collection=(objects)は、必要に応じて結合テーブルに追加または削除することで、コレクションに提供されたオブジェクトのみを含むようにします。

この関連では、他にも多くの方法があります。リンクされたguideを確認することをおすすめします。これらのメソッドを使用すると、直接操作することなくジョイン・テーブルを管理できるはずです。 RailsとActive Recordがあなたのために仕事をするようにしましょう。

決勝思想

あなたが参加するモデルを介した結合テーブルへのより直接的なアクセスを持っているしたい場合は、has_and_belongs_to_many関連付けを使用しないでください。おそらく、ジョイン・テーブルに属性を追加したい場合や、ジョイン・モデル自体に対して検証やコールバックを行いたい場合があります。この場合は、代わりにhas_many :through associationを使用してください。 This blog postは設定方法を説明しています。

+0

優れた回答です。あなたが言及したシャベル演算子 '<<'を使って、ジョインテーブルにレコードを追加することができました。 'オプション= MeetOption.find_by(名称: 'メンター')' 'user.meet_options << option'また だけでなく、複数のmeet_optionアイテムと連携 'オプション= MeetOption.all' 'ユーザー。 meet_options << options' –

+0

私はプロジェクト全体で 'has_many:through'をたくさん使っていますが、今度は単純な多対多の関係が必要なだけで、他の属性は保持されません。良い考え、ありがとう。 –

+0

問題ありません。喜んで助けてください。 –

関連する問題