Isto segue esta questão prévia, que foi respondido. Na verdade, descobri que era possível remover uma associação dessa consulta. Agora, a consulta de trabalho é
start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Isso parece funcionar. No entanto, quando tento mover esses DeckCards para outra associação, recebo o erro ActiveRecord :: ReadOnlyRecord.
Aqui está o código
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
e os modelos relevantes (quadro são as cartas dos jogadores na mesa)
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
Estou fazendo uma ação semelhante logo após esse código, aumentando DeckCards
a mão do jogador, e esse código está funcionando bem. Gostaria de saber se eu precisava belongs_to :tableau
no modelo DeckCard, mas funciona bem para adicionar à mão do jogador. Eu tenho as colunas a tableau_id
e hand_id
na tabela DeckCard.
Procurei ReadOnlyRecord na API do Rails, e isso não diz muito além da descrição.
fonte
Ou no Rails 3 você pode usar o método readonly (substitua "..." pelas suas condições):
fonte
readonly
função.Isso pode ter mudado na versão recente do Rails, mas a maneira apropriada de resolver esse problema é adicionar : readonly => false às opções de localização.
fonte
select ('*') parece corrigir isso no Rails 3.2:
Apenas para verificar, omitir select ('*') produz um registro somente leitura:
Não posso dizer que entendi a lógica, mas pelo menos é uma solução rápida e limpa.
fonte
select(quoted_table_name + '.*')
readonly(false)
Em vez de find_by_sql, você pode especificar a: select no localizador e tudo ficará feliz novamente ...
start_cards = DeckCard.find :all, :select => 'deck_cards.*', :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
fonte
Para desativá-lo ...
fonte