在其他两个模型之间创建关联时传递用户 ID

Posted

技术标签:

【中文标题】在其他两个模型之间创建关联时传递用户 ID【英文标题】:Pass user id when creating an association between two other models 【发布时间】:2016-03-01 20:27:09 【问题描述】:

我完全被一些看起来应该如此简单的东西所困扰。我有一个订阅模型,它创建与帐户模型的关联。这部分工作正常,使用:

after_create :create_account

我想要的是将用户传递到帐户记录中,最好是作为 account_manager。我也有一个 user_id 字段,但我更喜欢使用 account_manager_id。我可以手动做到这一点,但让它自动发生会让我绊倒。我尝试了多种方法将当前用户传递到帐户中,方法是在我的帐户控制器中的创建下放置各种选项。到目前为止还没有运气。有人有什么想法吗?

@account = Account.new(params[:account].merge(account_manager_id: current_owner))


@user = current_user
@account = @user.accounts.create(params[:account])


@account = Account.new(account_params)
@account.account_manager = current_user


@account = current_user.accounts.build(params[:account])

我的账户管理员

class AccountsController < ApplicationController

  def index
     @accounts = Account.all
  end

  def show
    @account = Account.find(params[:id])
  end

  def new
   @account = Account.new
  end

  def edit
    @account = Account.find(params[:id])
  end

  def create 
    @account = Account.new(account_params)
    @account.account_manager = current_user
      if @account.save
        flash[:success] = "Content Successfully Created"
        redirect_to @account
      else
        render 'new'
    end
  end

  def update
     @account = Account.find(params[:id])
      if @account.update(account_params)
        flash[:success] = "Your account was successfully updated"
        redirect_to current_user
      else
         render 'edit'
    end
  end

  def destroy
  @account = Account.find(params[:id])
    @account.destroy
    respond_to do |format|
      flash[:info] = "The grant was successfully destroyed"
    end
  end

  private

    # Never trust parameters from the scary internet, only allow the white list through.
    def account_params
      params.require(:account).permit(:name, :user_id, :account_manager_id,:subscription_id)
    end
end

account.rb

class Account < ActiveRecord::Base
  has_and_belongs_to_many :users
  belongs_to :account_manager, :class_name => 'User', :foreign_key => 'account_manager_id'
  belongs_to :subscription, :dependent => :destroy
end

用户.rb

class User < ActiveRecord::Base
    has_one :subscription
    has_and_belongs_to_many :account

订阅.rb

class Subscription < ActiveRecord::Base
  include Koudoku::Subscription

  has_one :account
  belongs_to :user
  belongs_to :coupon
  after_create :create_account #after a subscription is created, automatically create an associtaed account

end

【问题讨论】:

提供模型和控制器的代码以供审查。 您是否遇到错误?如果有,请发帖。另外,你在几个地方拼错了“manager”(“manger”)。 啊,很好地抓住了“经理”。创建订阅时,我在网站上没有收到任何错误。但是当我检查 Account.all account_manager_id 和 user_id 都是零。 所以我仔细检查了我的“经理”拼写,但仍然没有通过当前用户。我确实在日志中看到订阅负载 (0.3ms) SELECT "subscriptions".* FROM "subscriptions" WHERE "subscriptions"."user_id" = $1 LIMIT 1 [["user_id", 18]]。也许我可以使用订阅中的 user_id,因为它是同一个人。 那么到底是什么问题? AccountsController#create 失败了吗?如果是这样,请提供堆栈跟踪或正在抛出的错误消息。 【参考方案1】:

拿出来

after_create :create_account

并添加以下内容

# subscriptions_controller.rb
def create
  ...
  if @subscription.save
    @subscription.create_account(account_manager: current_user)
  end
end

【讨论】:

以上是关于在其他两个模型之间创建关联时传递用户 ID的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 如何让两个用户 ID 与模型相关联

如何创建正确的关联

与单独形式的多态关联

Rails:不使用参数时关联两个不同的模型[:id]

Rails复杂模型关联,用户和团队之间的共享文档

将 MODEL_id 传递给另一个模型参数