[解決済み】ActiveRecord::ReadOnlyRecordのエラーの原因は何ですか?
質問
これは以下の通りです。 これ の前の質問で、回答がありました。実は、このクエリからジョインを削除できることがわかりました。
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
と関連するModels(tableauはテーブル上のプレイヤーカード)
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
カラムを作成します。
rails apiでReadOnlyRecordを調べてみましたが、説明以上のことは書いてありませんね。
どのように解決するのですか?
Rails 2.3.3以下
から
ActiveRecord
CHANGELOG
(v1.12.0、2005年10月16日)
:
読み取り専用レコードを導入する。 object.readonly! オブジェクトを読み取り専用としてマークし を呼び出すと、ReadOnlyRecordが表示されます。 object.save。 object.readonly? オブジェクトが読み取り専用かどうか。 に :readonly => true を渡します。 ファインダメソッドは、返された レコードを読み取り専用にします。 を使用すると、:joins オプションは :readonly を意味するようになったので、もし このオプションを使用した場合、同じ のレコードは失敗するようになりました。 find_by_sqlを使用します。 で回避できます。
使用方法
find_by_sql
は、行/列の生データを返すので、実際には代替案にはなりません。
ActiveRecords
. 2つの選択肢があります。
-
インスタンス変数を強制的に
@readonly
をfalseに設定する必要があります(ハック)。 -
使用方法
:include => :card
の代わりに:join => :card
Rails 2.3.4以上
2012年9月10日以降、上記のほとんどは適用されなくなりました。
-
使用
Record.find_by_sql
は 実行可能な選択肢 -
:readonly => true
は自動的に推論されます のみ もし:joins
が指定された場合 なし 明示的な:select
また 明示的な(あるいはファインダースコープ継承の):readonly
オプションの実装を参照してください。set_readonly_option!
でactive_record/base.rb
の実装はRails 2.3.4用、あるいはto_a
でactive_record/relation.rb
とのcustom_join_sql
でactive_record/relation/query_methods.rb
Rails 3.0.0用) -
が、しかし
:readonly => true
には常に自動的に推論されます。has_and_belongs_to_many
結合テーブルが2つ以上の外部キーカラムを持ち、かつ:joins
を明示的に指定せずに:select
(すなわち、ユーザーが提供する:readonly
の値は無視されます。finding_with_ambiguous_select?
でactive_record/associations/has_and_belongs_to_many_association.rb
.) -
結論として、特殊なジョインテーブルと
has_and_belongs_to_many
であれば@aaronrustad
の回答は、Rails 2.3.4 と 3.0.0 で問題なく適用されます。 -
する
ではなく
使用
:includes
を実現したい場合はINNER JOIN
(:includes
を意味する。LEFT OUTER JOIN
よりも選択性が低く、効率も悪い。INNER JOIN
.)
関連
-
[解決済み】修正方法:エラー:'<ファイル名>'にチェックアウトされたコミットがない fatal: コマンドプロンプトで "git add ." を入力するとファイルの追加に失敗する
-
[解決済み】TypeError: SymbolからIntegerへの暗黙の変換がない。
-
[解決済み] Railsサーバーがポートはすでに使用されていると言う、そのプロセスを殺すにはどうすればよいですか?
-
[解決済み】Webpacker::Manifest::MissingEntryError【クローズド
-
[解決済み] Rubyの文字列から日付への変換
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] Railsでpng画像を文字列形式で表示するには?
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】警告:定数 ::Fixnum は非推奨 新しいモデルを生成するとき
-
[解決済み] サーバーに接続できませんでした。そのようなファイルまたはディレクトリがありません (PG::ConnectionBad)
-
[解決済み】Rails 4 RoutingError: ルートが一致しない[POST]。
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜでしょうか?
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] DestroyとDeleteの違い
-
[解決済み] Railsでpng画像を文字列形式で表示するには?
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜ?
-
[解決済み] railsアプリケーションでCookieのオーバーフロー?