[Ruby-On-Rails] इस ActiveRecord :: ReadOnlyRecord त्रुटि का कारण क्या है?



Answers

या रेल 3 में आप रीडोनली विधि का उपयोग कर सकते हैं (अपनी स्थितियों के साथ "..." को प्रतिस्थापित करें):

( Deck.joins(:card) & Card.where('...') ).readonly(false)
Question

यह this पूर्व प्रश्न का पालन करता है, जिसका उत्तर दिया गया था। मुझे वास्तव में पता चला कि मैं उस क्वेरी से जुड़ सकता हूं, इसलिए अब कामकाजी क्वेरी है

start_cards = DeckCard.find :all, :joins => [:card], :conditions => ["deck_cards.deck_id = ? and cards.start_card = ?", @game.deck.id, true]  

यह काम प्रतीत होता है। हालांकि, जब मैं इन डेककार्ड्स को किसी अन्य संगठन में स्थानांतरित करने का प्रयास करता हूं, तो मुझे 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

और प्रासंगिक मॉडल (टेबलू टेबल पर खिलाड़ियों के कार्ड हैं)

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 जोड़ रहा DeckCards , और वह कोड ठीक काम कर रहा है। मुझे आश्चर्य हुआ कि मुझे डेककार्ड मॉडल में belongs_to :tableau आवश्यकता है belongs_to :tableau लेकिन यह खिलाड़ी के हाथ में जोड़ने के लिए ठीक काम करता है। मेरे पास डेककार्ड तालिका में एक tableau_id और hand_id कॉलम हैं।

मैंने रेल एपीआई में ReadOnlyRecord देखा, और यह विवरण से परे ज्यादा नहीं कहता है।




चयन करें ('*') रेल 3.2 में इसे ठीक करने के लिए प्रतीत होता है:

> Contact.select('*').joins(:slugs).where('slugs.slug' => 'the-slug').first.readonly?
=> false

बस सत्यापित करने के लिए, चयन ('*') को छोड़कर एक पठनीय रिकॉर्ड उत्पन्न होता है:

> Contact.joins(:slugs).where('slugs.slug' => 'the-slug').first.readonly?
=> true

यह नहीं कह सकता कि मैं तर्क को समझता हूं लेकिन कम से कम यह एक त्वरित और साफ कामकाज है।




इसे निष्क्रिय करने के लिए ...

module DeactivateImplicitReadonly
  def custom_join_sql(*args)
    result = super
    @implicit_readonly = false
    result
  end
end
ActiveRecord::Relation.send :include, DeactivateImplicitReadonly



Links