覆盖特定功能的条件模型关联

时间:2015-03-18 15:28:14

标签: ruby ruby-on-rails-4

我有一个用户模型,它将返回状态为true的用户研究:

has_many :user_studies, -> { where(status: true) }, dependent: :destroy

我使用它超过80%的功能,但在某些情况下我想覆盖这行代码。

我在User控制器中有一个私有方法,用于完成用户学习的工作:

def set_user_study
  @user_study = @user.user_studies.find(params[:id])
end

@user在另一个私有方法中设置:

def set_user
  @user = users_api.find_by_guid(params[:user_id])
rescue Longboat::Api::Users::NotFound => e
  logger.error e.message
  raise ActionController::RoutingError.new('Not Found')
end

当我尝试编辑user_study(以及其他)时调用private方法:

before_action :set_user_study, only: [:edit, :update, :destroy]

在尝试编辑状态为true的研究时,显然会出现以下错误:

Couldn't find UserStudy with 'id'=1 [WHERE "user_studies"."user_id" = ? AND "user_studies"."status" = 't']

如何继续调用私有方法,但允许用户能够编辑用户研究状态是否为真?

1 个答案:

答案 0 :(得分:1)

如果您的目标只是覆盖关联,请不要使用@user.user_studies。相反,查询值并在私有方法中使用UserStudy.where(user_id: @user.id)。但是,如果现有代码中user_studies的使用率较低,则只需删除关联条件和链范围即可添加此条件。