我有一个模型Property
,并且我有一个如下定义的虚拟属性:
def uid_type
if mls? && mls.to_i != 0
"MLS"
elsif property_identifier? && property_identifier.to_i != 0
"PID"
else
"ID"
end
end
如果我有一个属性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...
答案 0 :(得分:2)
您必须编写自己的范围,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 != ''")