我有两个型号,用户和促销活动。这个想法是促销可以有很多用户,用户可以有很多促销。
class User < ActiveRecord::Base
has_and_belongs_to_many :promotions
end
class Promotion < ActiveRecord::Base
has_and_belongs_to_many :users
end
我还有一个promotion_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
我确信我的问题有一个非常简单的解决方案,我只是不是以正确的方式寻找解决方案。
答案 0 :(得分:46)
user = User.find(params[:id])
promotion = Promotion.find(params[:promo_id])
user.promotions << promotion
user.promotions
是一系列与用户相关的促销活动。
有关您可用的所有不同功能,请参阅apidock。
答案 1 :(得分:9)
你可以做到
User.promotions = promotion #notice that this will delete any existing promotions
或
User.promotions << promotion
您可以阅读has_and_belongs_to_many
关系here。
答案 2 :(得分:8)
这也很有用
User.promotion.build(attr = {})
因此,当您保存用户对象时,促销对象会保存。
这是
User.promotion.create(attr = {})
创建促销,您无需保存或用户模型
答案 3 :(得分:1)
如果您想使用原型的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 ...>]>