SORU
12 Mart 2009, PERŞEMBE


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
12 Mart 2009, PERŞEMBE


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:

  1. Örnek değişkeni @readonly Kayıt false (hack) kuvvet
  2. :join => :card yerine :include => :card kullanı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_sql kullanarakuygun bir seçenek
  • :readonly => true otomatik olarak algılanırsadeceeğer :joins belirtildiolmadanaçık :selectne deaçık (veya Bulucu-kapsam-miras) :readonly seçeneği (bkz uygulanması set_readonly_option! active_record/base.rb Raylar 2.3.4 veya uygulanması to_a active_record/relation.rb custom_join_sql active_record/relation/query_methods.rb Raylar 3.0.0)
  • ancak, :readonly => true Her zaman otomatik olarak algılanır has_and_belongs_to_many eğer katılmak tablosu var, daha iki yabancı anahtar sütunları ve :joins belirtildi Olmadan Açık :select (yani kullanıcı tarafından sağlanan :readonly değ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 (:includes daha az seçici veINNER JOIN. daha az verimli olan LEFT OUTER JOIN, bir anlamına gelir) elde etmek istiyorsanız 26 **

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Friday Night Cranks

    Friday Night

    27 Mayıs 2007
  • guau . .

    guau . .

    25 Ocak 2008
  • Rayone GB

    Rayone GB

    14 Temmuz 2007