Для тех, кто находится в аналогичной ситуации, я нашел простое решение: используйте Spring Autowiring, который найдет все реализации данного интерфейса или класса в конфигурации и поместит их в массив.
@Component
), как в примере в вопросе. В диспетчере упаковщиков добавьте следующий код.
@Autowired
protected AbstractPropertiesWrapper[] wrappers;
Массив wrappers
будет содержать все обертки, включая SOP, без необходимости, чтобы основной модуль знал что-либо о проекте SOP.
направляющие 2.3.3 и ниже
От <глоток> ActiveRecord CHANGELOG
(v1.12.0, 16-го октября 2005) глоток>:
Представляют записи только для чтения. Если Вы называете object.readonly! тогда это отметит объект как только для чтения и повысит ReadOnlyRecord при вызове object.save. object.readonly? отчеты, только ли объект для чтения. Передача: только для чтения => верный для любого метода средства поиска отметит возвращенные записи как только для чтения. : опция соединений теперь подразумевает: только для чтения, поэтому если Вы используете эту опцию, сохраняя ту же запись, теперь перестанет работать. Использование find_by_sql для работы вокруг.
Используя find_by_sql
не действительно альтернатива, поскольку она возвращает необработанные данные строки/столбец, не ActiveRecords
. У Вас есть две опции:
@readonly
ко лжи в записи (взлом) :include => :card
вместо :join => :card
направляющие 2.3.4 и выше
большая часть вышеупомянутого больше не сохраняется после 10 сентября 2012:
Record.find_by_sql
, жизнеспособный вариант :readonly => true
автоматически выведен только [1 152], если :joins
был определен без [1 153] явное :select
, ни явное (или наследован от средства поиска от-объема) :readonly
опция (см. реализацию [1 111] в [1 112] для направляющих 2.3.4 или реализации [1 113] в [1 114] и [1 115] в [1 116] для направляющих 3.0.0) :readonly => true
всегда автоматически выводится в [1 118], если объединяющая таблица имеет больше, чем эти два столбца внешних ключей и :joins
были определены без явного :select
(т.е. предоставленный пользователями :readonly
, значения проигнорированы - см. finding_with_ambiguous_select?
в [1 123].) has_and_belongs_to_many
, тогда @aaronrustad
ответ не применяется очень хорошо в направляющих 2.3.4 и 3.0.0. :includes
, если Вы хотите достигнуть INNER JOIN
(:includes
, подразумевает LEFT OUTER JOIN
, который является менее выборочным и менее эффективным, чем [1 130].) Вместо find_by_sql можно указать a: выберите на средстве поиска, и все счастливо снова...
start_cards = DeckCard.find :all, :select => 'deck_cards.*', :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Это могло быть изменено в недавнем выпуске Rails, но подходящий способ решить эту проблему - добавить : readonly => false в параметры поиска.
Или в Rails 3 вы можете использовать метод readonly (замените "..." вашими условиями):
( Deck.joins(:card) & Card.where('...') ).readonly(false)