Что вызывает этот ActiveRecord:: ошибка ReadOnlyRecord?

Для тех, кто находится в аналогичной ситуации, я нашел простое решение: используйте Spring Autowiring, который найдет все реализации данного интерфейса или класса в конфигурации и поместит их в массив.

  1. Определите классы свойств в XML (или как @Component), как в примере в вопросе.
  2. В диспетчере упаковщиков добавьте следующий код.

    @Autowired
    protected AbstractPropertiesWrapper[] wrappers;
    

Массив wrappers будет содержать все обертки, включая SOP, без необходимости, чтобы основной модуль знал что-либо о проекте SOP.

202
задан Community 23 May 2017 в 00:30
поделиться

4 ответа

направляющие 2.3.3 и ниже

От <глоток> ActiveRecord CHANGELOG (v1.12.0, 16-го октября 2005) :

Представляют записи только для чтения. Если Вы называете object.readonly! тогда это отметит объект как только для чтения и повысит ReadOnlyRecord при вызове object.save. object.readonly? отчеты, только ли объект для чтения. Передача: только для чтения => верный для любого метода средства поиска отметит возвращенные записи как только для чтения. : опция соединений теперь подразумевает: только для чтения, поэтому если Вы используете эту опцию, сохраняя ту же запись, теперь перестанет работать. Использование find_by_sql для работы вокруг.

Используя find_by_sql не действительно альтернатива, поскольку она возвращает необработанные данные строки/столбец, не ActiveRecords. У Вас есть две опции:

  1. Сила переменная экземпляра @readonly ко лжи в записи (взлом)
  2. Использование :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].)
282
ответ дан morhook 23 November 2019 в 04:59
поделиться

Вместо 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]

5
ответ дан 23 November 2019 в 04:59
поделиться

Это могло быть изменено в недавнем выпуске Rails, но подходящий способ решить эту проблему - добавить : readonly => false в параметры поиска.

44
ответ дан 23 November 2019 в 04:59
поделиться

Или в Rails 3 вы можете использовать метод readonly (замените "..." вашими условиями):

( Deck.joins(:card) & Card.where('...') ).readonly(false)
171
ответ дан 23 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: