我看了看,但是我找不到一种允许我根据单个条件选择特定列的方法(不涉及字符串查询)。条件是任意的,但列名始终相同。以下是我最近(并且绝望)的尝试,以更好地说明我想要做的事情。
@notExists = Company.select("name").where("name = ?", :company)
好的,查询是正确的,我忘了使用'=>'在下面的代码中。然而,现在出现错误的原因是:公司正在评估为“公司”。根据服务器输出窗口中的params列表,其值为'sample'。
修改:完整内容
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable, :lockable and :timeoutable
# Setup accessible (or protected) attributes
attr_accessible :email, :password, :password_confirmation, :remember_me, :company
validates :company, :presence => true
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :timeoutable
after_save :correspond
def correspond
@notExists = Company.select("name").where("name = ?", :company)
if @notExists.empty?
c = Company.new(:name => :company)
c.save
end
end
end
要查看此问题的完整解决方案,请参阅下面的dmarkow答案。需要进行一项更改才能打勾:
def correspond
c = Company.find_or_create_by_name(self.company)
end
答案 0 :(得分:2)
阻止代码工作的唯一因素是您尝试使用:company
转换为字符串而不是变量。
修改强>:
您的对应方法应使用参数定义,方法的第一行应使用该参数,如下所示:
def correspond(user)
@notExists = Company.select("name").where("name = ?", user.company)
然而,这是一种更清洁的方式 - 如果公司不存在,它只会创建公司:
def correspond(user)
c = Company.find_or_create_by_name(user.company)
end
答案 1 :(得分:0)
你的查询似乎很好。如果您只想获得列值,可以执行以下操作:
company = Company.select("name").where("name = ?", :company).first
value = company && company.name
答案 2 :(得分:0)
@notExists = Company.select("name").where("name = ?", :company)
如果不存在匹配的记录,将返回[]
@notExists = Company.select("name").where("name = ?", :company).first
如果不存在匹配的记录,将返回nil
所以,如果你依赖它是nil
,如果记录不存在,你需要第二个。
您可以使用@notExists.empty?