如何根据该模型的虚拟属性返回的值搜索整个模型?

时间:2018-11-12 01:00:35

标签: ruby-on-rails activerecord ruby-on-rails-3.2

我有一个模型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...

1 个答案:

答案 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 != ''")