gpt4 book ai didi

mysql - Rails ActiveRecord 处理一个不是主键的 id 列

转载 作者:可可西里 更新时间:2023-11-01 07:58:52 25 4
gpt4 key购买 nike

即使它是一个单独的列,ActiveRecord 也会自动将 :id 属性分配为主键。

Table - legacy-table

id - int
pk_id - int (primary key)
name - varchar2
info - varchar2

模型

class LegacyModel < ActiveRecord::Base
self.table_name = 'legacy-table'
self.primary_key = 'pk_id'
default_scope {order(:name => :asc)}
alias_attribute :other_id, :id

end

我不关心 ActiveRecord 自动将主键 (pk_id) 分配给 :id 属性,但是我失去了对实际 id 列的所有访问权限。尝试使用别名只会让我回到主键。

然而,对此问题的一个警告是,从 View 中我可以使用@legacymodel[:id] 访问 id 列。但是再次调用 @legacymodel.id 时,我得到了 pk_id 列的值。我想要的是能够调用 @legacymodel.other_id 并让它指向 id 列。相反,@legacymodel.service_id、@legacymodel.id 和@legacymodel.pk_id 都指向同一列 pk_id

请注意,这是一个遗留数据库,修改列是不可能的。我将 Rails 4 与 MySql 结合使用。

有什么办法可以解决这个问题吗?为什么@legacymodel[:id] 给我的结果与@legacymodel.id 不同?

最佳答案

@cschroed 的回答在最新的 Rails (v4.2) 中对我不起作用。深入研究 Rails 源代码,如果传递的键等于“id”,read_attribute 似乎也会使用主键值:

  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

因为 [] 方法使用了 read_attribute,所以这不再有效。

我发现直接从属性散列中读取反而有效:

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

这提供了一种通过模仿 _read_attribute 来绕过 read_attribute 的方法。

关于mysql - Rails ActiveRecord 处理一个不是主键的 id 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23298349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com