sql >> Database teknologi >  >> RDS >> Mysql

Rails ActiveRecord håndterer en id-kolonne, der ikke er den primære nøgle

Svaret fra @cschroed virkede ikke for mig i den seneste Rails (v4.2). Når man graver i Rails-kildekoden, ser det ud til, at read_attribute vil også bruge den primære nøgleværdi, hvis den passerede nøgle er lig 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

Da [] metoden bruger read_attribute , dette virker ikke længere.

Jeg fandt ud af, at direkte læsning fra attributternes hash fungerede i stedet:

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

Dette gav et middel til at omgå read_attribute ved at efterligne _read_attribute .



  1. Sådan slippes en fremmednøgle i SQLite

  2. Mens du udfører PITR, ville det være muligt at pause/genoptage i PostgreSQL?

  3. Hvad er standardnavnet i MySQL?

  4. Sådan omdøbes en JSON-nøgle i SQL Server (T-SQL)