Bu neden ActiveRecord::ReadOnlyRecord hata?
Bu yanıtlandı this önce soru, izler. Aslında bu sorgudan katılın, şimdi işçi sorgu yani çıkarabilirim keşfetti
start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]
Bu iş gibi görünüyor. Başka bir dernek bu DeckCards taşımaya çalıştığımda, ancak ActiveRecord::ReadOnlyRecord hata.
İşte kod
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
ilgili Modeller (tablo masada poker)
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
Sadece bu kodu sonra benzer bir eylem yapıyor, oyuncular el DeckCards ekliyorum ve bu kod iyi çalışıyor. Eğer DeckCard Modeli belongs_to :tableau ihtiyacım vardı, ama oyuncuya ekleme için gayet iyi çalışıyor merak ettim. DeckCard Tablo tableau_id hand_id bir sütun var.
Yukarı raylar apı ReadOnlyRecord baktım ve çok açıklama ötesinde bir şey yazmıyor.
CEVAP
ActiveRecord CHANGELOG dan(v1.12.16, 2005) Ekim 0,:
Salt okunur kayıtları tanıtmak. Eğer nesne arayın.salt okunur! sonra mark salt okunur ve arttırma nesnesi olarak Eğer ararsan ReadOnlyRecord nesne.Kaydet. nesne.salt okunur? raporlar ister nesne salt okunur. Geçen :salt okunur =>gerçek herhangi bir Bulucu yöntemi döndü işaretler salt okunur olarak kaydeder.:Katıldı seçenek anlamına gelir :salt okunur, eğer öyleyse bu seçenek, aynı tasarruflu kullanın şimdi kayıt başarısız olur.Kullanım find_by_sql geçici bir çözüm bulmak için.
find_by_sql kullanarak gerçekten ham satır/sütun veri, ActiveRecords döner gibi bir alternatifi yok. İki seçeneğiniz var:
- Örnek değişkeni
@readonlyKayıt false (hack) kuvvet :join => :cardyerine:include => :cardkullanın
Eylül 2010 GÜNCELLEŞTİRİN
Yukarıdaki çoğu artık geçerlidir. Böylece, Raylar 2.3.4ve3.0.0:
Record.find_by_sqlkullanarakuygun bir seçenek:readonly => trueotomatik olarak algılanırsadeceeğer:joinsbelirtildiolmadanaçık:selectne deaçık (veya Bulucu-kapsam-miras):readonlyseçeneği (bkz uygulanmasıset_readonly_option!active_record/base.rbRaylar 2.3.4 veya uygulanmasıto_aactive_record/relation.rbcustom_join_sqlactive_record/relation/query_methods.rbRaylar 3.0.0)- ancak,
:readonly => trueHer zaman otomatik olarak algılanırhas_and_belongs_to_manyeğer katılmak tablosu var, daha iki yabancı anahtar sütunları ve:joinsbelirtildi Olmadan Açık:select(yani kullanıcı tarafından sağlanan:readonlydeğerleri yok sayılır ...finding_with_ambiguous_select?active_record/associations/has_and_belongs_to_many_association.rb.) - özel bir birleşim tablosu ve
has_and_belongs_to_many@aaronrustad'In cevabı gayet Raylar 2.3.4 ve 3.0.0 geçerlidir. ile ilgili sürece sonuç olarak, - yapındeğilkullanıyorsanız
INNER JOIN(:includesdaha az seçici veINNER JOIN. daha az verimli olanLEFT OUTER JOIN, bir anlamına gelir) elde etmek istiyorsanız 26 **

Eclipse hata ayıklayıcı her zaman Thre...
Neden daha iyi bir IDE hata ayıklama?...
Neden apple-touch-icon-precomposed içi...
Neden=hata AYIKLAMA Yanlış ayar benim ...
Neden yok C# statik bir yöntem bir örn...