29

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

class User < ActiveRecord::Base
  has_and_belongs_to_many :promotions
end

class Promotion < ActiveRecord::Base
  has_and_belongs_to_many :users
end

また、promotions_usersテーブル/モデルがあり、独自のIDはありません。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

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

4

4 に答える 4

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

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

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

于 2010-04-29T19:32:11.767 に答える
11

あなたはちょうどすることができます

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

また

User.promotions << promotion

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

于 2010-04-29T19:32:46.343 に答える
9

これも便利です

User.promotion.build(attr = {})

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

そしてこれは

User.promotion.create(attr = {})

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

于 2010-04-29T19:41:20.897 に答える
1

プロトタイプの PromotionsController CRUD セットアップを使用して User を Promotion に追加する必要があり、Rails フォーム ヘルパーを使用していない場合は、params を次のようにフォーマットできます。

params = {id: 1, promotion: { id: 1, user_ids: [2] }}

これにより、コントローラーをスリムに保つことができます。たとえば、updateメソッドに特別なものを追加する必要はありません。

class PromotionsController < ApplicationController

  def update
    promotion.update(promotion_params)

    # simplified error handling
    if promotion.errors.none?
      render json: {message: 'Success'}, status: :ok
    else
      render json: post.errors.full_messages, status: :bad_request
    end
  end

  private

  def promotions_params
    params.require(:promotion).permit!
  end

  def promotion
    @promotion ||= Promotion.find(params[:id])
  end
end

結果は次のようになります。

irb(main)> Promotion.find(1).users
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 2 ...>]>
于 2020-04-29T22:16:56.343 に答える