Rails查询数据库并将其存储到控制器中的变量中

时间:2019-02-26 06:24:26

标签: ruby-on-rails select

我一直在阅读Rails指南中的文档,但似乎找不到解决方法。

我希望能够查询模型中的特定列并将其存储到变量中。我认为我能做的最好的事情就是编写SQL查询来解释它。

这是我的控制器定义

  def upvote
    @request = Request.find(params[:request_id]) # Do you still need this ?


    @requestID = Request.find(params[:id])
    @requestEmail = Request.where(id: @requestID).select(:email)


    @request.email = current_user.email
    @requestNewEmail = @request.email + ', ' +  @requestEmail
    @request.email = @requestNewEmail

    @request.increment!(:voteCount)
    @request.save
    render json: { voteCount: @request.voteCount , email: @request.email}
  end 

这就是我想要完成的事情:

SELECT email FROM requests WHERE id = requestID

我尝试过的所有方法均返回错误Couldn't find Request without an ID

no implicit conversion from Request to string

我想念什么?

2 个答案:

答案 0 :(得分:1)

注意:由于评论空间不足,因此只能作为答案发布。可以通过更好地了解需求来改善这一点。

当我们尝试将no implicit conversion from Request to string与字符串连接时,会发生错误@requestEmail。这行很准确:

@requestNewEmail = @request.email + ', ' +  @requestEmail

这是因为我们使用以下查询获取@requestEmail

@requestEmail = Request.where(id: @requestID).select(:email)

它的作用是返回一个ActiveRecord::Relation对象。类似于#<ActiveRecord::Relation [#<Request id: nil, email: <some_email>>]>。这是一个数组,我们可以使用@requestEmail.first.email从中获取第一封电子邮件,然后将其与字符串连接。
但是,在您的代码中,您已经将所需记录提取为

@requestID = Request.find(params[:id])

这可用于获取所需的电子邮件值,而不用进行另一个数据库调用。也就是说,@requestID.email本身会为您提供您尝试使用@requestEmail = Request.where(id: @requestID).select(:email)获取的值
我认为,如果要求更加明确,则可以简化整体代码。也许您可以详细解释要实现的目标?当前答案可能会解决该错误,但是我相信可能会有更好的方法来满足您的要求,因为整个模块感觉有些不妥。
请随时发表评论以解释进一步的细节。

答案 1 :(得分:0)

您可以在Request模型中创建一个方法,并在控制器操作中使用它

# app/models/request.rb
def add_email(new_email)
  update(email: email + ', ' + new_email)
end

# controller/requests_controller.rb
def upvote
  @request = Request.find(params[:request_id]) 
  @request.add_email(current_user.email)
end