ruby-on-rails 向has_and_belongs_to_many关系添加记录

lpwwtiir  于 2023-02-20  发布在  Ruby
关注(0)|答案(5)|浏览(132)

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

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>

如果我试试这句话: 促销活动= www.example.com(www.example.com)user.promotions.new(promo.id)
我得到这个错误:

TypeError: can't dup Fixnum

我相信有一个非常简单的解决方案,我的问题,我只是没有寻找解决方案的正确方式。

v1uwarro

v1uwarro1#

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

user.promotions是与用户关联的促销数组。
请参阅apidock,了解所有可用的不同功能。

hgncfbus

hgncfbus2#

你可以只做

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

User.promotions << promotion

您可以在这里阅读有关has_and_belongs_to_many关系的信息。

nue99wik

nue99wik3#

这也很有用

User.promotion.build(attr = {})

因此,当您保存用户对象时,升级对象也会保存。
这是

User.promotion.create(attr = {})

创建促销,您无需保存它或用户模型

ds97pgxw

ds97pgxw4#

如果您想使用原型PromotionsController CRUD设置将用户添加到促销中,并且您 * 不 * 使用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 ...>]>
sz81bmfz

sz81bmfz5#

对于当前的所有这些,Rails确实有内置的函数,就像更简单的关联。
对于构建(即Promotion.new),您可以使用

user.promotions.build(promotion_attributes)

创造它是一样的

user.promotions.create(promotion_attributes)

我只想给予一个更熟悉的选项,在apidoc中有概述,其他答案也一样。

相关问题