Dies folgt dieser vorherigen Frage, die beantwortet wurde. Ich habe tatsächlich festgestellt, dass ich einen Join aus dieser Abfrage entfernen kann. Jetzt funktioniert die Abfrage
start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Dies scheint zu funktionieren. Wenn ich jedoch versuche, diese DeckCards in eine andere Zuordnung zu verschieben, wird der Fehler ActiveRecord :: ReadOnlyRecord angezeigt.
Hier ist der 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
und die relevanten Modelle (Tableau sind die Spielerkarten auf dem Tisch)
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
Ich mache eine ähnliche Aktion direkt nach diesem Code und füge DeckCards
sie der Hand des Spielers hinzu, und dieser Code funktioniert einwandfrei. Ich habe mich gefragt, ob ich belongs_to :tableau
das DeckCard-Modell brauche, aber es funktioniert gut für das Hinzufügen zur Hand des Spielers. Ich habe ein tableau_id
und hand_id
Spalten in der DeckCard-Tabelle.
Ich habe ReadOnlyRecord in der Rails-API nachgeschlagen, und es sagt nicht viel über die Beschreibung hinaus.
quelle
Oder in Rails 3 können Sie die Readonly-Methode verwenden (ersetzen Sie "..." durch Ihre Bedingungen):
quelle
readonly
Funktion auch nicht erwähnt .Dies hat sich möglicherweise in der letzten Version von Rails geändert. Die geeignete Lösung für dieses Problem besteht jedoch darin, den Suchoptionen Folgendes hinzuzufügen : readonly => false .
quelle
select ('*') scheint dies in Rails 3.2 zu beheben:
Nur um dies zu überprüfen, führt das Weglassen von select ('*') zu einem schreibgeschützten Datensatz:
Ich kann nicht sagen, dass ich die Gründe verstehe, aber es ist zumindest eine schnelle und saubere Lösung.
quelle
select(quoted_table_name + '.*')
readonly(false)
Anstelle von find_by_sql können Sie ein: select im Finder angeben und alles ist wieder glücklich ...
start_cards = DeckCard.find :all, :select => 'deck_cards.*', :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
quelle
Um es zu deaktivieren ...
quelle