【发布时间】:2010-12-31 06:22:56
【问题描述】:
我已经习惯了预言,你可以简单地
concat(field1, ' ', field2)
但是如果我使用 activerecord 来查找 field1 和 field2,并且我需要在两者之间留一个空格,我该如何完成呢?
为你的帮助干杯
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 activerecord
我已经习惯了预言,你可以简单地
concat(field1, ' ', field2)
但是如果我使用 activerecord 来查找 field1 和 field2,并且我需要在两者之间留一个空格,我该如何完成呢?
为你的帮助干杯
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 activerecord
在你的模型中:
def full_name
[first_name, last_name].join(' ')
end
【讨论】:
对于后代和未来的 googlers,假设 postgres(也许是 mysql?),您可以执行以下操作:
User.select("(first_name || ' ' || last_name) as name").where(organization: current_user.organization)
select 使用||SQL operator 连接来自first_name 和last_name 字段的字符串,as name 在“名称”列中返回结果。
可能会返回:
+----+--------------------+
| id | name |
+----+--------------------+
| 3 | Ada Lovelace |
| 18 | Alan Turing |
+----+--------------------+
【讨论】:
我认为虚拟属性正合您的胃口。 This Railscast 解释了它们,并提供了一个与您的用例相似的示例。
【讨论】:
在连接具有不同数据类型的两个字段时使用#。
例如,将一个整数和一个字符串与+ 相加会报错。
class User < ActiveRecord::Base
def name
"#{first_name} #{last_name}"
end
end
【讨论】:
扩展@Chase Gilliam 响应,这是对 MySQL 数据库的查询
User.select("id, CONCAT(name, last_name) as value")
希望有帮助
【讨论】:
我的解决方案::)
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
【讨论】: