Как найти всю модель на основе значения, возвращенного виртуальным атрибутом этой модели? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть модель 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 голосов
/ 12 ноября 2018

Вы должны написать свою собственную область, 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 != ''")
...