Cela fait suite à cette question préalable, à laquelle il a été répondu. J'ai découvert que je pouvais supprimer une jointure de cette requête, alors maintenant la requête de travail est
start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Cela semble fonctionner. Cependant, lorsque j'essaie de déplacer ces DeckCards dans une autre association, j'obtiens l'erreur ActiveRecord :: ReadOnlyRecord.
Voici le code
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
et les modèles pertinents (le tableau représente les cartes des joueurs sur la table)
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
Je fais une action similaire juste après ce code, ajoutant DeckCards
à la main des joueurs, et ce code fonctionne très bien. Je me demandais si j'avais besoin belongs_to :tableau
du modèle DeckCard, mais cela fonctionne bien pour l'ajout à la main du joueur. J'ai des colonnes tableau_id
et hand_id
dans la table DeckCard.
J'ai recherché ReadOnlyRecord dans l'api des rails, et cela ne dit pas grand-chose au-delà de la description.
la source
Ou dans Rails 3, vous pouvez utiliser la méthode en lecture seule (remplacez "..." par vos conditions):
la source
readonly
fonction.Cela a peut-être changé dans la version récente de Rails, mais la façon appropriée de résoudre ce problème consiste à ajouter : readonly => false aux options de recherche.
la source
select ('*') semble résoudre ce problème dans Rails 3.2:
Juste pour vérifier, l'omission de select ('*') produit un enregistrement en lecture seule:
Je ne peux pas dire que je comprends la justification, mais au moins c'est une solution rapide et propre.
la source
select(quoted_table_name + '.*')
readonly(false)
Au lieu de find_by_sql, vous pouvez spécifier a: sélectionnez sur le viseur et tout est à nouveau heureux ...
start_cards = DeckCard.find :all, :select => 'deck_cards.*', :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
la source
Pour le désactiver ...
la source