Ini mengikuti ini pertanyaan sebelumnya, yang menjawab. Saya sebenarnya menemukan bahwa saya dapat menghapus gabungan dari kueri itu, jadi sekarang kueri yang berfungsi adalah
start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Ini tampaknya berhasil. Namun, ketika saya mencoba untuk memindahkan DeckCards ini ke asosiasi lain, saya mendapatkan kesalahan ActiveRecord :: ReadOnlyRecord.
Ini kodenya
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
dan Model yang relevan (tablo adalah kartu pemain di atas meja)
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
Saya melakukan tindakan serupa tepat setelah kode ini, menambah DeckCards
ke tangan pemain, dan kode itu berfungsi dengan baik. Saya bertanya-tanya apakah saya perlu belongs_to :tableau
dalam Model DeckCard, tetapi itu berfungsi dengan baik untuk penambahan ke tangan pemain. Saya punya tableau_id
dan hand_id
kolom di tabel DeckCard.
Saya mencari ReadOnlyRecord di api rel, dan tidak banyak bicara di luar deskripsi.
sumber
Atau di Rails 3 Anda dapat menggunakan metode readonly (ganti "..." dengan kondisi Anda):
sumber
readonly
fungsinya.Ini mungkin telah berubah dalam rilis Rails baru-baru ini, tetapi cara yang tepat untuk menyelesaikan masalah ini adalah dengan menambahkan : readonly => false ke opsi find.
sumber
pilih ('*') tampaknya untuk memperbaikinya di Rails 3.2:
Hanya untuk memverifikasi, menghilangkan pilih ('*') menghasilkan catatan hanya baca:
Tidak bisa mengatakan saya mengerti alasannya tetapi setidaknya itu solusi yang cepat dan bersih.
sumber
select(quoted_table_name + '.*')
readonly(false)
Alih-alih find_by_sql, Anda dapat menentukan: pilih pada finder dan semuanya bahagia lagi ...
start_cards = DeckCard.find :all, :select => 'deck_cards.*', :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
sumber
Untuk menonaktifkannya ...
sumber