我在控制器中有一个方法,用于检查数据库中是否已存在字段值。在我的情况下,我要检查多个字段,例如用户名,电子邮件和URL通过AJAX。
所以我写了下面的函数
def check_field_already_exist?(field, params )
merchant_url = MerchantUrl.where(field: filter_params[field.to_sym]).first
# here params[:id] is available only while editing the MerchantUrl
is_available = if (params[:id] && merchant_url)
merchant_url.id == params[:id]
else
merchant_url.blank?
end
end
并以
方式调用此方法 def is_name_available
render json: check_field_already_exist?('username', params)
end
def is_url_available
render json: check_field_already_exist?('url', params)
end
def is_email_available
render json: check_field_already_exist?('email', params)
end
但在执行时它会抛出错误
Mysql2 ::错误:未知栏' merchant_urls.field' 在' where子句':SELECT merchant_urls
。* FROM {{1在merchant_urls
。merchant_urls
=' http://localhost:3000'
那么,是否有任何方法可以将字符串变量用作字段名称? 谢谢。
答案 0 :(得分:4)
正确的方式是使用旧的hashrocket语法
merchant_url = MerchantUrl.where(field => filter_params[field])
答案 1 :(得分:3)
在我看来,你这样做是错误的。当您将id传递给方法时(在params内),为什么不使用它来获取merchant_url
,然后检查该字段是否包含内容:
def check_field_already_exist?(field, id=nil)
if id && merchant_url = MerchantUrl.find(id)
merchant_url.send(field).try('present?')
else
MerchantUrl.exists?(field => filter_params[field.to_sym])
end
end
然后你可以
def is_name_available
render json: check_field_already_exist?('username', params[:id])
end
虽然我个人认为,我有一个方法将模型实例属性hash返回为json,然后用JavaScript客户端检查哈希的内容。这样,只需一次回调服务器即可获得所需数据(而不是每个字段一次)。
答案 2 :(得分:1)
在代码中,field
是一个标识列名的符号。
你应该这样做:
merchant_url = MerchantUrl.where("#{field} = ?", filter_params[field.to_sym])
答案 3 :(得分:0)
我希望这有效
def check_field_already_exist?(field, params )
merchant_url = MerchantUrl.where("#{field}=?", filter_params[field.to_sym]).first
is_available = if (params[:id] && merchant_url)
merchant_url.id == params[:id]
else
merchant_url.nil?
end
end
但请确保field
不应该是最终用户可以通过params设置的东西。否则它将非常脆弱。