Можно ли динамически назначать другой метод доступа к переменной экземпляра и сохранять его в новых экземплярах? - PullRequest
1 голос
/ 03 октября 2011

У меня есть ситуация, когда я импортирую каналы из нескольких источников, и мне приходится иметь дело с тем фактом, что атрибуты не являются согласованными для всех каналов. Итак, для примера некоторых атрибутов, мой сайт хотел бы распознать их в продукте:

name, description, category, url

А затем добавьте карту Feed 1, хотя ее атрибуты:

product_name, descript, category_primary, product_url

И Лента 2 имеет атрибуты:

Product, Description, CategoryFirst, URLToProduct

Таким образом, я могу импортировать все продукты в таблицу mongoid, используя имена полей динамически по мере их появления в ленте. Я мог бы тогда иметь страницу, которая позволяет администратору сопоставлять имена атрибутов фида с глобальными именами атрибутов. Но как проще всего сопоставить имена глобальных атрибутов с конкретными фидами? Другими словами, я хотел бы сказать Feed.find (id) .products.name и получить от него значение, заданное именем атрибута конкретного канала (будь то "product_name" или "Product" или что-то еще_

1 Ответ

0 голосов
/ 04 октября 2011

У вас может быть другая модель, позволяющая администратору настраивать каналы.Эта модель просто сохраняет имена полей входящих атрибутов канала, сопоставленных с вашим продуктом, и преобразует элемент канала в продукт.

class FeedToProductConverter
  include Mongoid::Document

  field :converter_name, :type => String
  field :name, :type => String
  field :description, :type => String
  field :category, :type => String
  field :url, :type => String

  def convert(feed_item)
    p = Product.new
    p.name = feed_item[self.name]
    p.description = feed_item[self.description]
    p.category = feed_item[self.category]
    p.url = feed_item[self.url]

    p
  end

  def convert_and_save(feed_item)
    convert(feed_item).save
  end
end

Теперь вы берете данные от администратора и сохраняете их.Всякий раз, когда администратор хочет импортировать канал, он выбирает соответствующий конвертер, а в бэкэнде вы используете его для преобразования элементов канала в ваши собственные продукты.Использование любого продукта так же, как вы хотите позже.

...