web-dev-qa-db-ja.com

has_and_belongs_to_many関係にレコードを追加します

ユーザーとプロモーションの2つのモデルがあります。プロモーションには多くのユーザーを含めることができ、ユーザーは多くのプロモーションを行うことができるという考え方です。

class User < ActiveRecord::Base
  has_and_belongs_to_many :promotions
end

class Promotion < ActiveRecord::Base
  has_and_belongs_to_many :users
end

また、独自のIDを持たないpromotions_usersテーブル/モデルもあります。 user_idとpromotions_idを参照します

class PromotionsUsers < ActiveRecord::Base
end

では、どうすればユーザーをプロモーションに追加できますか?私はこのようなことを試しました:

user = User.find(params[:id])
promotion = Promotion.find(params[:promo_id])
promo = user.promotions.new(promo)

これにより、次のエラーが発生します。

NoMethodError: undefined method `stringify_keys!' for #<Promotion:0x10514d420>

代わりにこの行を試してみると:promo = user.promotions.new(promo.id)

このエラーが発生します:

TypeError: can't dup Fixnum

私の問題には非常に簡単な解決策があると確信しており、正しい方法で解決策を探しているわけではありません。

25
Kevin Whitaker
user = User.find(params[:id])
promotion = Promotion.find(params[:promo_id])
user.promotions << promotion

user.promotionsは、ユーザーに関連付けられたプロモーションの配列です。

使用可能なすべてのさまざまな関数については、 apidock を参照してください。

48
Tony Fontenot

あなたはただすることができます

User.promotions = promotion #notice that this will delete any existing promotions

または

User.promotions << promotion

has_and_belongs_to_manyの関係について読むことができます ここ

10
Ju Nogueira

これも便利です

User.promotion.build(attr = {})

したがって、ユーザーオブジェクトを保存すると、プロモーションオブジェクトが保存されます。

そしてこれは

User.promotion.create(attr = {})

保存する必要のないプロモーションやユーザーモデルを作成する

9
Mehmet Davut