2015-04-14 2 views
2

В Rails 3/4 модели, если поле field1 объявлен с attr_accessor:Rails/Ruby - Как проверить, существует ли поле attr_accessor?

attr_accessor :field1 

Как проверить поздно, если field1 существует в модели ?. column_exists? и method_defined?, кажется, работают только с колонкой модели, а field1 не является колонкой модели.

+0

какая версия Rails? – Hardik

+0

Вы можете получить доступ к fied1, используя 'yourvariable.field1' Как только вы выполните' variable = Model.new', столбец существует, если вы хотите проверить, является ли он пустым, вы можете запустить 'variable.field1 === nil' – LolWalid

+0

ruby_on_raIls 3.2 или выше. – user938363

ответ

5

attr_accessor определяет два метода: def field1 и def field1=(val), поэтому лучшее, что вы можете сделать, это проверить для существования этих двух функций.

Если у вас есть объект:

object.respond_to? :field1 
object.respond_to? :field1= 

Если вы этого не сделаете, использование:

Class.instance_methods.include? :field1 
Class.instance_methods.include? :field1= 
+0

'reply_to?' Не дает правильного результата. – user938363

+0

Это дает вам ложные срабатывания или ложные негативы? – makhan

+0

ссылка: http://apidock.com/ruby/Module/attr_accessor – makhan

3

attr_accessor создаст геттер и сеттер метод в классе

метод column_names возвращает массив имен столбцов. Вы можете проверить, присутствует ли в нем столбец.

ModelClass.column_names.include?('column_name') 

И если вы хотите проверить, если геттер сеттер определены или нет, то вы должны использовать respond_to? метод на объекте модели

+0

'ModelClass.column_names' возвращает только поля в таблице, а не те, которые определены' attr_accessor'. – user938363

Смежные вопросы