sql >> Database >  >> RDS >> Mysql

Rails ActiveRecord verwerkt een id-kolom die niet de primaire sleutel is

Het antwoord van @cschroed werkte niet voor mij in de nieuwste Rails (v4.2). Als we in de Rails-broncode duiken, blijkt dat read_attribute zal ook de waarde van de primaire sleutel gebruiken als de doorgegeven sleutel gelijk is aan 'id':

  ID = 'id'.freeze

  # Returns the value of the attribute identified by <tt>attr_name</tt> after
  # it has been typecast (for example, "2004-12-12" in a date column is cast
  # to a date object, like Date.new(2004, 12, 12)).
  def read_attribute(attr_name, &block)
    name = attr_name.to_s
    name = self.class.primary_key if name == ID
    _read_attribute(name, &block)
  end

https://github .com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/attribute_methods/read.rb

Aangezien de []-methode read_attribute gebruikt , dit werkt niet meer.

Ik ontdekte dat het rechtstreeks lezen van de attributen-hash werkte:

# LegacyModel class
def other_id
  @attributes.fetch_value('id')
end

Dit bood een manier om read_attribute te omzeilen door _read_attribute . na te bootsen .



  1. COALESCE() voor lege (maar niet null) velden

  2. MySQL-foutcode:1411. Onjuiste datetime-waarde:'' voor functie str_to_date

  3. CASE-instructie binnen WHERE-clausule in SQL Server 2008

  4. ORACLE SQL:Haal alle gehele getallen tussen twee getallen