4

我已经习惯了 oracle 在那里你可以简单地

concat(field1, ' ', field2)

但是如果我使用 activerecord 来查找 field1 和 field2,并且我需要在两者之间留一个空格,我该如何完成呢?

为你的帮助干杯

4

6 回答 6

9

在您的模型中:

def full_name
  [first_name, last_name].join(' ')
end
于 2009-12-30T22:12:05.047 回答
7

对于后代和未来的 googlers,假设 postgres(也许是 mysql?),您可以执行以下操作:

User.select("(first_name || ' ' || last_name) as name").where(organization: current_user.organization)

select 使用|| SQL 运算符连接字段first_name和中的字符串last_name,并as name在“名称”列中返回结果。

可能会返回:

+----+--------------------+
| id | name               |
+----+--------------------+
| 3  | Ada Lovelace       |
| 18 | Alan Turing        |
+----+--------------------+
于 2016-11-02T17:28:06.960 回答
2

我认为虚拟属性正合您的胃口。这个 Railscast用一个看起来就像你的用例的例子来解释它们。

于 2009-12-30T22:09:48.073 回答
1

扩展@Chase Gilliam 响应,这是对 MySQL 数据库的查询

User.select("id, CONCAT(name, last_name) as value")

希望有帮助

于 2018-09-29T21:10:08.113 回答
1

#在连接具有不同数据类型的两个字段时使用。

例如,添加一个整数和字符串 with+会产生错误。

class User < ActiveRecord::Base
  def name
    "#{first_name} #{last_name}"
  end
end
于 2017-05-31T04:14:03.377 回答
0

我的解决方案::)

scope :full_name_contains, lambda { |query| 
  full_name = Arel::Nodes::NamedFunction.new('concat', [
      arel_table[:first_name], 
      Arel::Nodes.build_quoted(' '), 
      arel_table[:last_name]
    ]
  )

  where(full_name.matches("%#{query}%"))
}

def full_name
  "#{first_name} #{last_name}"
end
于 2020-03-30T13:13:33.197 回答