在Ruby on Rails中检查行是否存在

3

我刚开始学习Ruby on Rails,有mysql的基础知识,现在正在使用MySQL数据库。我的问题是:如何检查表中是否存在行。我尝试了这段代码,但它没有直接进入else块,而是进入了if块:

@tasks = User.find_by("user_name = ? AND password = ?", params[:user_name], params[:password])
if @tasks
  redirect_to action: 'index', status: 302
else
  redirect_to action: 'detail', status: 302
end

将来,如果有什么不按预期工作,请解释以何种方式它没有工作,比如是否收到任何错误消息,或者响应是什么,即使它不是正确的响应。 - user456814
尝试查找具有唯一字段的用户。 - Bharat soni
1
#杯子蛋糕--我没有收到任何错误信息。它直接进入了else条件。 - Sariban D'Cl
@Bharatsoni .. 我没听懂你的意思。 - Sariban D'Cl
1
@Cupcake OP 的意思是在 find_by 中删除字符串插值。 - Vamsi Krishna
显示剩余11条评论
3个回答

2
如果你想使用Ruby on Rails查找是否存在具有给定名称和密码的用户,则可以这样做:
User.where(user_name: params[:user_name], password: params[:password]).exists?

查看RailsGuides:对象的存在

问题的根本原因是什么?

所以,这就是原始帖子最初提交的代码:

User.find_by("user_name = ? AND password = ?", "#{params[:user_name]}", "#{params[:password]}")

我删除了字符串插值,因为它是不必要的。
User.find_by("user_name = ? AND password = ?", params[:user_name], params[:password])

"而且显然这解决了问题。虽然我不确定为什么会有所不同,但插值字符串应该是与params字典中的值相同的值。"

谢谢,它正在工作。但是我写的有什么问题吗? - Sariban D'Cl
@D'Scolz 我其实也说不准,你最初的代码看起来好像也应该能工作。 - user456814
@D'Scolz,在Rails中没有find_by - PythonDev
1
@akshay 实际上,这里有 - user456814
@Cupcake,请在Twitter-bootstrap-rails上帮我一下。 - Sariban D'Cl

2
您可以根据您的需求使用以下任何一种解决方案。 方案一:
User.where(user_name: params[:user_name], password: params[:password]).exists?

解决方案2:

User.find_by_user_name_and_password(params[:user_name], params[:password])
  • where 返回的是一个 ActiveRecord::Relation 对象(尽管它看起来像一个数组),它是一个模型对象的集合。如果没有匹配的条件,它将返回一个空的 Relation。

  • find (以及相关的动态 find_by_columnname 方法)返回单个模型对象,或者可能是一个模型对象的数组(不是 Relation)。如果找不到任何结果,则会引发一个 ActiveRecord::RecordNotFound 异常。

因此,如果您只想要并期望一个单独的对象,使用 find 更容易,否则您必须调用 Model.where.first


假设我在表中有两行数据,这两行数据相同。在这种情况下,如果我使用 where,那么我将得到这两个值。 - Sariban D'Cl
请接受您认为最有帮助的答案。这将有助于其他用户。 - Vamsi Krishna

1
You can try it as well.
通过 User.find_by_user_name_and_password(params[:user_name], params[:password]) 进行尝试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接