sql >> Databasteknik >  >> RDS >> Mysql

Rails ActiveRecord hanterar en id-kolumn som inte är primärnyckeln

Svaret från @cschroed fungerade inte för mig i senaste Rails (v4.2). När du gräver i Rails källkod verkar det som read_attribute kommer också att använda det primära nyckelvärdet om nyckeln som skickas är lika med '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

Eftersom metoden [] använder read_attribute , detta fungerar inte längre.

Jag upptäckte att direkt läsning från attributens hash fungerade istället:

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

Detta gav ett sätt att kringgå read_attribute genom att härma _read_attribute .



  1. Hur man exporterar frågeresultat till en CSV-fil i SQL Developer (Oracle)

  2. Returnera kortdagens namn från ett datum i Oracle

  3. SQLite SUBSTRING() förklaras

  4. SQL, hur man använder SELECT