Esto sigue a esta pregunta anterior, que fue respondida. De hecho, descubrí que podía eliminar una combinación de esa consulta, por lo que ahora la consulta de trabajo es
start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Esto parece funcionar. Sin embargo, cuando intento mover estas DeckCards a otra asociación, aparece el error ActiveRecord :: ReadOnlyRecord.
Aquí está el 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
y los modelos relevantes (el cuadro son las cartas de los jugadores en la 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
Estoy haciendo una acción similar justo después de este código, agregando DeckCards
a la mano de los jugadores, y ese código funciona bien. Me preguntaba si lo necesitaba belongs_to :tableau
en el modelo DeckCard, pero funciona bien para agregarlo a la mano del jugador. Tengo una tableau_id
y hand_id
columnas en la tabla DeckCard.
Busqué ReadOnlyRecord en la API de rieles, y no dice mucho más allá de la descripción.
fuente
O en Rails 3 puede usar el método de solo lectura (reemplace "..." con sus condiciones):
fuente
readonly
función.Esto podría haber cambiado en la versión reciente de Rails, pero la forma adecuada de resolver este problema es agregar : readonly => false a las opciones de búsqueda.
fuente
select ('*') parece corregir esto en Rails 3.2:
Solo para verificar, omitir select ('*') produce un registro de solo lectura:
No puedo decir que entiendo la lógica, pero al menos es una solución rápida y limpia.
fuente
select(quoted_table_name + '.*')
readonly(false)
En lugar de find_by_sql, puede especificar a: select en el buscador y todo vuelve a ser feliz ...
start_cards = DeckCard.find :all, :select => 'deck_cards.*', :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
fuente
Para desactivarlo ...
fuente