Отговорът от @cschroed не работи за мен в най-новия Rails (v4.2). Ровейки в изходния код на Rails, изглежда, че read_attribute
ще използва и стойността на първичния ключ, ако предаденият ключ е равен на '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
Тъй като методът [] използва read_attribute
, това вече не работи.
Открих, че директното четене от хеша на атрибутите работи вместо това:
# LegacyModel class
def other_id
@attributes.fetch_value('id')
end
Това предостави средство за заобикаляне на read_attribute
като имитира _read_attribute
.