ActiveRecord: Як отримати всі атрибути моделі, які можуть бути призначені масово?


75

Я хотів би мати список усіх імен атрибутів, які можна масово призначити. Мені це потрібно для спеціального конструктора форм, який за замовчуванням не додасть поля введення, які неможливо призначити масово.

Наприклад, якщо я маю таку модель:

class Post < ActiveRecord::Base
  attr_protected :account

  belongs_to :author

  validates_presence_of :title, :author
end

Я хотів би мати в результаті [:author, :title].

Відповіді:


99

Post.accessible_attributes охоплює це, якщо ви чітко визначили attr_accessible

Заборонивши це, робити щось подібне незграбно, але працює:

Post.new.attributes.keys - Post.protected_attributes.to_a

отже, якщо access_attributes отримує ті, які явно attr_accessible'd, а protected_attributes отримує ті, що явно attr_protect'd, чи існує метод, який повідомляє вам, які з них доступні, незалежно від того, захищені вони через attr_protected або attr_accessible?
Chris Drappier

Дякуємо за розміщення. Це було чудовим доповненням до мого методу атрибутів фільтра.
Кірк

4
Виникла проблема, це перелічить: created_at,: updated_at як доступні атрибути !!, вони не
MhdSyrwan

3
@MhdSyrwan: Ви впевнені, що не говорите про те, що: created_at та: updated_at SHOULDN'Tбудуть доступними замість ARE NOT? якщо ви передасте введення з іменем = "post [created_at]" і value = "01/01/2012", чи не перейде воно до моделі? ось це так. Залежить від вашої версії Rails (ядро Rails змінить значення за замовчуванням після скандалу Github / доступні атрибути).
Брено Сальгадо

1
@BrenoSalgado: ти маєш рацію :), це залежить від версії рейок chrisroos.co.uk/blog/…
MhdSyrwan

81

Деякі з вищезазначених відповідей можуть не стосуватися Rails 4.

Ви можете використовувати, MyModel.attribute_namesщоб отримати масив атрибутів таблиці, хоча це може не дати вам масово призначаються атрибути, оскільки цей аспект Rails змінюється з версією 4 http://weblog.rubyonrails.org/2012/3/21/strong-parameters /


2
це те, що мені потрібно було дякувати. Я рубаю навколо відключення масового призначення лише для моделі. :-)
NullVoxPopuli

25

Просто використовуйте

Post.accessible_attributes

Це поверне всі атрибути, доступні для класу


1
Зверніть увагу, що якщо ви використовуєте кілька ролей, ви можете отримати різні списки, передавши символ - Post.accessible_attributes(:user), Post.accessible_attributes(:admin)і т. Д. Я також знайшов Post.active_authorizersкорисне, він повертає хеш усіх визначених ролей та їх доступних атрибутів.
Елліот Нельсон,

Яку версію рубіну ви використовуєте?
Антуан

1
Використання Ruby 2.2.2; Rails 4.1.2: У мене є Userмодель, підкріплена таблицею бази даних. Бо User.accessible_attributesя отримуюNoMethodError: undefined method "accessible_attributes" for #<Class:0x007f9216346fe8>
sameers

Моя версія reils 4.2.6, але вона повертає помилку. Але відповідь @Scudelletti працює.
Пінгвін

20

Для моделей ви можете використовувати MyModel.attribute_namesабо MyModel.column_names.

Для прикладів, які ви можете використовувати MyModel.new.attribute_names.


1

Post.accessible_attributes.to_a.map(&:to_sym)


3
Краще було б пояснити.
Абдулла Хан,

З черги огляду: Чи можу я попросити вас додати ще трохи контексту навколо своєї відповіді. Відповіді лише за кодами важко зрозуміти. Це допоможе автору запиту та майбутнім читачам, якщо ви зможете додати більше інформації у своєму дописі.
help-info.de
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.