Мне просто интересно, может ли кто-нибудь помочь.

Я пытаюсь получить название модели через консоль rails, и это дает мне другие результаты.

Сначала я делаю:

Department.first.name

И результат:

Department Load (0.3ms)  SELECT  "departments".* FROM "departments"  ORDER BY "departments"."id" ASC LIMIT 1
=> "Operations"

Тогда я делаю:

ops = Department.where(name: "Operations")

И результат:

=> ActiveRecord::Relation #[Department id: 1, name: "Operations", created_at: "2017-10-22 00:40:51", updated_at: "2017-10-22 00:40:51"]>

Но тогда, если я пытаюсь получить:

ops.name

Результат:

=> "Department"

Это смущает меня и приводит к проблемам ассоциации. Пожалуйста помоги!

2
Pshemski 22 Окт 2017 в 14:02

3 ответа

Лучший ответ

Это потому, что когда вы используете where, это дает вам ActiveRecord::Relation, и, как вы можете видеть, они могут быть одним или несколькими объектами, в зависимости от того, что находится в вашей базе данных, но вы должны повторять их, чтобы дать конкретный атрибут на каждом из них.

В случае, если вы используете Model.first, он дает вам конкретную запись, поэтому вы можете получить «прямой» доступ к атрибуту этого объекта.

Если вы хотите получить атрибут имени каждого из ваших отделов, вы можете использовать pluck, например:

Department.where(condition).pluck(attributes)
1
Sebastian Palma 22 Окт 2017 в 11:11

Даже если ops имеет только один результат, это не один Department, а ActiveRecord::Relation, поэтому

ops.name дает вам название модели (имя класса).

Вы должны получить первый

ops.first.name
0
Ursus 22 Окт 2017 в 11:10
ops = Department.where(name: "Operations")

Возвращает ActiveRecord::Relation объект. не Department объект (если только вы не заявили о намерении (первый, последний и т. д.)). Вы определили свойство name для класса Department, который возвращает поле name из базы данных. Не для ActiveRecord :: Relation; и name имеет другое значение там. Возвращает имя отношения / класса.

0
marmeladze 22 Окт 2017 в 11:14