ActiveModel эквивалент для ActiveRecord has_attribute? - PullRequest
4 голосов
/ 06 июня 2011

Я использую ActiveModel, потому что подключаюсь к стороннему API, а не к БД. Я написал свой собственный инициализатор, чтобы я мог передать хеш, и он будет преобразован в атрибуты модели - для поддержки некоторых форм в приложении.

attr_accessor :Id, :FirstName, :LastName,...

def initialize(attributes = {})
  attributes.each do |name, value|
    send("#{name}=", value)
  end
end

Проблема в том, что я хочу использовать ту же модель для обработки извлечения данных из API, но в ней есть масса других данных, которые меня не особо волнуют. Поэтому я хочу проверить, как я перебираю хеш, возвращенный из API, и проверять, существует ли атрибут в моей модели, а если нет, то просто игнорировать его. Это должно позволить мне иметь согласованную модель как для сообщений формы, так и для данных, возвращаемых из API. Что-то вроде:

def initialize(attributes = {})
  attributes.each do |name, value|
    if self.has_attribute?(name)
      send("#{name}=", value)
    end
  end
end

Я просмотрел документацию по API ActiveModel, но, похоже, нет аналога. Это заставляет меня чувствовать, что я должен делать это по-другому.

Это правильный (Rails) способ сделать это? Как убедиться, что у меня есть согласованные атрибуты модели, когда данные поступают из разных источников?

1 Ответ

4 голосов
/ 06 июня 2011

Исходя из приведенного выше примера кода, вам вообще не нужно использовать метод ActiveModel, подобный has_attribute? - вы можете просто вернуться к обычному Ruby:

def initialize(attributes = {})
  attributes.each do |name, value|
    send("#{name}=", value) if respond_to?("#{name}=")
  end
end

Атрибут будет назначен только в том случае, если он был инициирован с attr_accessor.

...