Разработка архитектуры интерфейса приложения Rails - PullRequest
0 голосов
/ 04 декабря 2010

У меня есть приложение rails, которое служит интерфейсом для гибрида данных. Большая часть необходимой мне информации извлекается из программы командной строки с использованием XML-RPC. Помимо этого, мне требуются некоторые дополнительные данные, которые у меня нет другого выбора, кроме как хранить их в базе данных. По этой причине у меня возникают проблемы с определением наилучшего способа разработки приложения.

Я переопределил self.all и self.find(id) так, что они полагаются на вызовы super, а затем "обогащают" объект, определяя его переменные экземпляра для соответствующих данных, извлекаемых из программы с использованием XML-RPC.

Хотя все это кажется довольно запутанным. Например, я думаю, что потерял способность использовать магические искатели (find_by_x), и я не знаю, сломается ли что-нибудь еще в результате этого.

У меня вопрос: есть ли более логичный и разумный способ сделать это? То есть, проектирование приложения, которое в большинстве случаев зависит от XML-RPC как от своих данных, так и от некоторых данных, хранящихся в базе данных.

Я читал о after_find. Используя этот обратный вызов, я могу реализовать процесс «обогащения объекта» и запускать его каждый раз, когда найдена запись. Однако мой метод получения данных, связанных с элементом, отличается от метода получения всех данных элемента. Способ, которым я делаю это для извлечения всех данных элемента (self.all), является более эффективным, но, к сожалению, неприменимым, для извлечения только одного данных элемента (self.find). Это было бы хорошо, если бы я мог сделать так, чтобы обратный вызов не применялся к self.all вызовам.

1 Ответ

2 голосов
/ 05 декабря 2010

По моему опыту, вы не должны связываться с искателями ActiveRecord - существует много магии, на которую они полагаются.

after_find - отличное направление для начала, но если у вас возникли проблемы с пакетной обработкой, то я бы рекомендовал использовать два варианта - использовать слой кэширования и alias_method_chain для реализации версии #all, которая выполняет ваш пакетный поиск XML-RPC, кэширует его, а затем передает вызов по несвязанному оригиналу all. Затем ваш after_find сначала проверит ваш кэш на наличие данных, а если его там нет, выполните удаленный поиск. Это позволило бы вам успешно пакетировать данные для all находок при использовании обратного вызова.

Тем не менее, вероятно, есть более простой способ сделать это. Я бы просто использовал модели, которые не происходят от ActiveRecord::Base, а скорее, которые происходят от некоторого базового интерфейса XMLRPC, а затем имеют поддельные ассоциации на них, которые указывают на экземпляры AR с информацией вашей базы данных. Таким образом, у вас может быть что-то вроде:

class XmlRpcModelBase
  ...

  def find(...)
  end

  def all(...)
  end

  def extra_data
    @extra_data ||= SomeActiveRecordModel.find(...)
  end
end

class Foo < XmlRpcModelBase

end

Это не идеально, и, честно говоря, это будет во многом зависеть от того, сколько из этого прочитано, а сколько - для чтения / записи, но я бы постарался остаться в стороне от ActiveRecord, где это возможно, и вместо этого просто бросить вызов кусочки, связанные с AR, если необходимо.

...