29

我有两个模型,用户和促销。这个想法是一个促销可以有很多用户,一个用户可以有很多促销。

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 设置将用户添加到 Promotion 并且您没有使用 Rails 表单助手,您可以将参数格式化为:

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 回答