我一直在阅读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
我想念什么?
答案 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