运行 创建不同模型的操作时更新用户 table

Update users table when running create action of different model

只是为了告诉你我是如何走到这一步的:

每个用户都有很多配置文件。每个配置文件都有由单一 table 继承(业余、专业和其他)识别的类型。我需要以某种方式将 current_profile 存储在某个地方。

专业控制器

class ProfessionalsController < ApplicationController
def create
  @professional = Professional.new(professional_params)
  @user = current_user
  @professional.user_id = current_user.id
  @update_current_profile = User.update(@user, {:current_profile => @professional.id})
  if @professional.save
    ...
  else
    ...
  end
end

private

  def professional_params
    params.require(:professional).permit(:id, :username, :user_id)
  end

end

这是为了将 current_profile 用户更新为新创建的专业配置文件,然后进行一些工作。

创建配置文件时 current_profile 设置(更新)为 NULL。如果我改变:

@update_current_profile = User.update(@user, {:current_profile => @professional.id})

不同的东西,例如:

@update_current_profile = User.update(@user, {:current_profile => @professional.user_id})

@update_current_profile = User.update(@user, {:current_profile => 3})

它在 User.current_profile 中完美地存储数据。

我也在尝试没有 .id 的@professional。为什么这样做?

另一个问题是。这是存储用户 current_profile 的最佳方式吗?你能给我推荐任何 better/safer/more 有效的解决方案吗?

谢谢大家。

@professional 是一个新的、未保存的记录,因此还没有 id。保存 @professional 记录后,只能更新 current_profile

只需稍微重新排序这些行,它应该可以工作:

def create
  @professional = Professional.new(professional_params)
  @user = current_user
  @professional.user_id = current_user.id
  if @professional.save
    @update_current_profile = User.update(@user, {:current_profile => @professional.id})
    # ...
  else
    # ...
  end
end

另一个提示:您在此方法中使用了许多实例变量(带有 @ 的实例变量)。我对你的代码了解不够,但我建议看看其中的一些代码是否可以用局部变量替换。经验法则:当您想要与另一个方法或视图共享该变量时,仅在控制器中使用实例变量。