Mysql
 sql >> Base de données >  >> RDS >> Mysql

Rails ActiveRecord gère une colonne id qui n'est pas la clé primaire

La réponse de @cschroed n'a pas fonctionné pour moi dans les derniers Rails (v4.2). En fouillant dans le code source de Rails, il apparaît que read_attribute utilisera également la valeur de la clé primaire si la clé transmise est égale à '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

Depuis, la méthode [] utilise read_attribute , cela ne fonctionne plus.

J'ai trouvé que la lecture directe à partir du hachage des attributs fonctionnait à la place :

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

Cela a fourni un moyen de contourner read_attribute en imitant _read_attribute .