select(column_name)的方法where(some single condition)

时间:2011-02-28 05:37:36

标签: sql ruby-on-rails

我看了看,但是我找不到一种允许我根据单个条件选择特定列的方法(不涉及字符串查询)。条件是任意的,但列名始终相同。以下是我最近(并且绝望)的尝试,以更好地说明我想要做的事情。

@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

3 个答案:

答案 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?

测试第一个