将记录添加到has_and_belongs_to_many关系中

Kev*_*ker 25 ruby-on-rails relationship has-and-belongs-to-many

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

class User < ActiveRecord::Base
  has_and_belongs_to_many :promotions
end

class Promotion < ActiveRecord::Base
  has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)

我还有一个promotion_users表/模型,没有自己的id.它引用了user_id和promotions_id

class PromotionsUsers < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)

那么,如何将用户添加到促销中?我尝试过这样的事情:

user = User.find(params[:id])
promotion = Promotion.find(params[:promo_id])
promo = user.promotions.new(promo)
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

NoMethodError: undefined method `stringify_keys!' for #<Promotion:0x10514d420>
Run Code Online (Sandbox Code Playgroud)

如果我尝试这一行:promo = user.promotions.new(promo.id)

我收到此错误:

TypeError: can't dup Fixnum
Run Code Online (Sandbox Code Playgroud)

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

Ton*_*not 46

user = User.find(params[:id])
promotion = Promotion.find(params[:promo_id])
user.promotions << promotion
Run Code Online (Sandbox Code Playgroud)

user.promotions 是一系列与用户相关的促销活动.

有关您可用的所有不同功能,请参阅apidock.


Ju *_*ira 9

你可以做到

User.promotions = promotion #notice that this will delete any existing promotions
Run Code Online (Sandbox Code Playgroud)

要么

User.promotions << promotion
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读has_and_belongs_to_many关系.

  • 请小心“User.promotions = Promotion”,因为这将删除任何现有的并添加传入的。 (2认同)

Meh*_*vut 9

这也很有用

User.promotion.build(attr = {})
Run Code Online (Sandbox Code Playgroud)

因此,当您保存用户对象时,促销对象会保存.

这是

User.promotion.create(attr = {})
Run Code Online (Sandbox Code Playgroud)

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