Это следует за этим предыдущим вопросом, на который был дан ответ. Я обнаружил, что могу удалить соединение из этого запроса, поэтому теперь рабочий запрос
start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Это похоже на работу. Однако, когда я пытаюсь переместить эти карты DeckCards в другую ассоциацию, я получаю ошибку ActiveRecord :: ReadOnlyRecord.
Вот код
for player in @game.players
player.tableau = Tableau.new
start_card = start_cards.pop
start_card.draw_pile = false
player.tableau.deck_cards << start_card # the error occurs on this line
end
и соответствующие модели (таблица - это карты игроков на столе)
class Player < ActiveRecord::Base
belongs_to :game
belongs_to :user
has_one :hand
has_one :tableau
end
class Tableau < ActiveRecord::Base
belongs_to :player
has_many :deck_cards
end
class DeckCard < ActiveRecord::Base
belongs_to :card
belongs_to :deck
end
Я делаю аналогичное действие сразу после этого кода, добавляя DeckCards
в руку игроков, и этот код работает нормально. Мне было интересно, нужна belongs_to :tableau
ли мне модель DeckCard, но она отлично работает для добавления в руку игрока. У меня есть tableau_id
и hand_id
столбцов в таблице DeckCard.
Я посмотрел ReadOnlyRecord в rails api, и это не говорит о многом за пределами описания.
источник
Или в Rails 3 вы можете использовать метод readonly (замените «...» на ваши условия):
источник
readonly
функцию.Возможно, это изменилось в последнем выпуске Rails, но подходящий способ решения этой проблемы - добавить : readonly => false в параметры поиска.
источник
select ('*'), кажется, исправляет это в Rails 3.2:
Просто чтобы проверить, опущение select ('*') действительно производит запись только для чтения:
Не могу сказать, что понимаю обоснование, но, по крайней мере, это быстрый и чистый обходной путь.
источник
select(quoted_table_name + '.*')
readonly(false)
Вместо find_by_sql, вы можете указать: select на искателе, и все снова будет счастливым ...
start_cards = DeckCard.find :all, :select => 'deck_cards.*', :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
источник
Чтобы деактивировать это ...
источник