Как следует разбивать модели Rails, содержащие базу данных и источники данных вне базы данных? - PullRequest
2 голосов
/ 16 сентября 2008

Так что я работаю над приложением Rails, чтобы почувствовать все это. У меня есть модель Product, которая является стандартной моделью ActiveRecord. Однако я также хочу получить дополнительную информацию о продукте от Amazon ECS. Поэтому моя полная модель получает некоторую информацию из базы данных, а другую - из веб-службы. У меня вопрос, должен ли я:

  1. Сделайте две модели Product и ProductAWS, а затем свяжите их вместе на уровне контроллера.

  2. Содержит ли модель Product ActiveRecord объект ProductAWS, который выполняет все функции AWS?

  3. Просто добавьте все функции AWS в мою модель продукта.

  4. ???

Ответы [ 4 ]

0 голосов
/ 17 сентября 2008

Если вы извлекаете данные из двух совершенно разных источников (ActiveRecord, с одной стороны, и из Интернета, с другой), существует множество преимуществ их хранения в качестве отдельных моделей. Как писал вышеупомянутый плакат, Product has_one (или has_many): aws_item.

0 голосов
/ 16 сентября 2008

@ Менно

Как насчет использования ActiveResource для класса атрибутов AWS?

0 голосов
/ 16 сентября 2008

Как с большинством вещей: это зависит. Каждая из ваших идей имеет свои достоинства. Если бы это был я, я бы начал так:

  class Product < ActiveRecord::Base
     has_one :aws_item
  end 
  class AWSItem 
     belongs_to :product
  end

Ключевые вопросы, которые вы хотите задать себе:

Будете ли вы предлагать только продукты AWS ECS или у вас будут другие продукты? Если у вас есть продукты, которые не имеют ничего общего с Amazon, вас не волнует ASIN и т. Д., тогда has_one может быть подходящим вариантом. Или, что еще лучше, полиморфное отношение к: доступному интерфейсу, так что вы сможете позже подключать различные типы расширений.

Это просто поведение, которое отличается, или данные тоже будут в значительной степени отличаться? Потому что вы можете рассмотреть:

class Product < ActiveRecord::Base
end 
class AWSItem < Product
  def do_amazon_stuff
    ... 
  end
end

Как вы хотите, чтобы система работала, когда Amazon ECS недоступен? Должно ли оно генерировать исключения? Или вы должны полагаться на локальную кэшированную версию каталога?

class Product < ActiveRecord::Base

end

class ItemFetcher < BackgrounDRb::Rails
   def do_work
      # .... Make a cached copy of your ECS catalog here. 
      # Copy the Amazon stuff into your local model
   end
end

Медленно пройдитесь по этим вопросам, и ответ станет яснее. Если это не так, начните создавать прототипы. Удачи!

0 голосов
/ 16 сентября 2008

Вы можете использовать отношение composed_of в ActiveRecord. Вы создаете обычный класс со всеми атрибутами, которыми вы управляете через AWS, и указываете, что ваш класс Product состоит из этого класса. ActiveRecord будет обрабатывать делегирование сопоставленных атрибутов этому классу и из него.

См. документацию на состав_

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...