ruby-on-rails - 如何根据模型上的虚拟属性返回的值搜索整个模型?
问题描述
我有一个模型Property
,我有一个定义如下的虚拟属性:
def uid_type
if mls? && mls.to_i != 0
"MLS"
elsif property_identifier? && property_identifier.to_i != 0
"PID"
else
"ID"
end
end
这样,如果我有一个 property p
,当我查询该虚拟属性时,这就是我所看到的:
> p.uid_type
=> "MLS"
基本上,我想做的是在我的模型上创建一个范围以返回所有具有uid_type == 'MLS'
.
我怎么做?
编辑 1
如果我试试这个:
Property.where('properties.uid_type == "MLS"').count
(4.6ms) SELECT COUNT(*) FROM "properties" WHERE (properties.uid_type == "MLS")
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column properties.uid_type does not exist
LINE 1: SELECT COUNT(*) FROM "properties" WHERE (properties.uid_typ...
解决方案
您必须编写自己的范围,ActiveRecord 对自定义方法没有多大帮助。
scope :with_mls_uid_type, -> { where.not(mls: [nil, '']) }
这将转化为:
SELECT "properties".*
FROM "properties"
WHERE ("properties"."mls" IS NOT NULL)
AND ("properties"."mls" != '')
如果您的标签是正确的并且您仍在 Rails 3.2 上,那么您将没有.not
,您将不得不这样做:
where("mls IS NOT NULL AND mls != ''")
推荐阅读
- doit - 并行运行时等待依赖
- javascript - 从头开始创建 toUpperCase 函数时的问题
- c - c中的sizeof运算符对相同类型的指针在C中给出不同的结果
- kubernetes - Openshift vs Rancher,有什么区别?
- php - 指定为定义者的用户('mysql.infoschema'@'localhost')不存在 - 第一个 Laravel 项目
- c# - 插入 URL 的变量未显示在地址栏中
- python-3.x - Python 程序 ValueError:以 10 为底的 int() 的无效文字:
- php - 发布方法不适用于 IIS 重写规则
- flutter - 来自 FutureBuilder 的 Navigator.pop
- javascript - 克隆 chrome CTRL + F 实现