Rails 3 - Атрибут на основе выражений в модели - PullRequest
0 голосов
/ 12 сентября 2011

Как определить атрибут модели как выражение другого атрибута?

Пример:

Class Home < ActiveRecord::Base
   attr_accessible :address, :phone_number

Теперь я хочу иметь возможность возвращать атрибут наподобие: area_code, который будет выражением sql наподобие "substr (phone_number, 1,3)".

Я также хочу иметь возможность использовать выражение / атрибут в группе по запросу для отчета.

Кажется, что это выполняет запрос, но не возвращает объект с именованными атрибутами, так как мне использовать его в представлении?

Консоль Rails:

@ac = Home.group("substr(phone_number, 1,3)").count
=> #<OrderedHash {"307"=>3, "515"=>1}>

Я также ожидал, что это сработает, но не уверен, какой тип объекта он возвращает:

@test = Home.select("substr(phone_number, 1,3) as area_code, count(*) as c").group("substr(phone_number, 1,3)")
=> [#<Home>, #<Home>]

Чтобы расширить последний пример. Вот с активной регистрацией записи:

>Home.select("substr(phone_number, 1,3) as area_code, count(*) as c").group("substr(phone_number, 1,3)")

Output:
Home Load (0.3ms) SELECT substr(phone_number, 1,3) as area_code, count(*) as c FROM "homes" GROUP BY substr(phone_number, 1,3)
=> [#<Home>, #<Home>]

Так что он выполняет запрос, который мне нужен, но дает мне неожиданный объект данных. Разве я не должен получить что-то подобное?

[ #<area_code: "307", c: 3>, #<area_code: "515", c: 1> ]

1 Ответ

0 голосов
/ 12 сентября 2011

вы не можете получить доступ к substr (...), поскольку он не является атрибутом инициализированного объекта записи.

См .: http://guides.rubyonrails.org/active_record_querying.html «Выбор определенных полей»

Вы можете обойти это так:

@test = Home.select("substr(phone_number, 1,3) as phone_number").group(:phone_number)

... но некоторые могут найти этонемного хакерскийБолее того, когда вы используете select, записи будут доступны только для чтения, поэтому будьте осторожны.

, если вам нужен счетчик, просто добавьте .count в конце цепочки, но вы получите хеш по мере того, какуже.Но разве это не все, что вам нужно?какова ваша цель?

Вы также можете использовать столбец area_code, который будет заполнен обратными вызовами при создании и обновлении, чтобы вы могли индексировать этот столбец;Ваш запрос будет выполняться быстро при чтении, но при вставке будет медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...