Câu trả lời của @cschroed không phù hợp với tôi trong Rails mới nhất (v4.2). Tìm hiểu kỹ mã nguồn Rails, có vẻ như read_attribute
cũng sẽ sử dụng giá trị khóa chính nếu khóa được truyền bằng '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
Vì, phương thức [] sử dụng read_attribute
, điều này không còn hoạt động.
Thay vào đó, tôi nhận thấy rằng việc đọc trực tiếp từ băm thuộc tính đã hoạt động:
# LegacyModel class
def other_id
@attributes.fetch_value('id')
end
Điều này cung cấp một phương tiện bỏ qua read_attribute
bằng cách bắt chước _read_attribute
.