Ruby on rails 将记录添加到一个has\u和\u-belies\u-to\u-many关系中

Ruby on rails 将记录添加到一个has\u和\u-belies\u-to\u-many关系中,ruby-on-rails,has-and-belongs-to-many,relationship,Ruby On Rails,Has And Belongs To Many,Relationship,我有两种型号,用户和促销。这个想法是一个促销可以有很多用户,一个用户可以有很多促销 class User < ActiveRecord::Base has_and_belongs_to_many :promotions end class Promotion < ActiveRecord::Base has_and_belongs_to_many :users end 这将导致以下错误: NoMethodError: undefined method `stringify

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

class User < ActiveRecord::Base
  has_and_belongs_to_many :promotions
end

class Promotion < ActiveRecord::Base
  has_and_belongs_to_many :users
end
这将导致以下错误:

NoMethodError: undefined method `stringify_keys!' for #<Promotion:0x10514d420>
我确信我的问题有一个非常简单的解决方案,我只是没有以正确的方式搜索解决方案。

user=user.find(params[:id])
user = User.find(params[:id])
promotion = Promotion.find(params[:promo_id])
user.promotions << promotion
升级=升级。查找(参数[:promo\u id]) user.promotions您只需

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

User.promotions这也很有用

User.promotion.build(attr = {})
所以,当您保存用户对象时,升级对象将保存

这是

User.promotion.create(attr = {})

创建促销您不需要保存它或用户模型

如果您想使用原型促销控制器CRUD设置将用户添加到促销中,并且您没有使用Rails表单帮助程序,则可以将参数格式化为:

params = {id: 1, promotion: { id: 1, user_ids: [2] }}
这允许您保持控制器纤细,例如,您不必向
更新方法添加任何特殊内容

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 ...>]>
irb(main)>Promotion.find(1).用户
=> #

感谢您的快速回复。我觉得我把事情搞得太复杂了。@Coolguy123是的,
collection小心
User.promotions=promotion
,因为这样会删除任何现有的并添加传入的。j.,我没有看到。这太棒了!比。@Tony:是的,我知道:]Tks。你肯定是说
user.promotions
而不是
user.promotions
。关联的方法位于实例而不是类上。
User.promotion.create(attr = {})
params = {id: 1, promotion: { id: 1, user_ids: [2] }}
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 ...>]>