考虑以下模型
class User < AR
has_many :resources
end
class Resource < AR
belongs_to :user
end
我需要在应用某些功能后保存外键。因此,资源表中user_id的值与users表中的id不匹配,但可以从id再次计算。
如何定义关联?我们假设函数是dummy_func()。
答案 0 :(得分:3)
由于belongs_to
返回类实例而不是关联,因此您可以在Resource
类
class Resource < ApplicationRecord
def user
User.find(user_id)
end
def user=(user)
user_id = user.id
end
end
类似于has_many
结果可以通过在resources
方法中创建公共关系来实现用户
class User < ApplicationRecord
def resources
Resource.where(user_id: id)
end
end
因此,如果您使用此代码,则可以替换Resource
模型中的任何ID,行为将与belongs_to
中的行为完全相同(可能深度存在一些差异)。您可以通过自己编写方法在User
模型中实现非常相似的行为。
答案 1 :(得分:2)
也许你可以使用回调来在保存之前以某种方式修改当前的user_id:callbacks。
我建议像:before_save或者那种性质的东西,在那里你定义了如何在资源表中修改user_id,然后也有办法解密它。
也许您可以使用加密gem来加密和解密您的属性,例如attr-encrypted。
希望这有点帮助!
答案 2 :(得分:2)
在用户模型中,您可以覆盖设置器。如果要加密和解密用户ID(使用attr_encrypted)...
您可以尝试这样的事情:
attr_encrypted :id, key: ENCRYPTION_KEYS[:value]
def id=(value)
send("encrypted_value=", encrypt(:id, value))
instance_variable_set(:@id, value)
end
然后你可以创建一个解密ID
的方法def decrypted_id
decrypt(:id, encrypted_value)
end
现在,创建用户时,数据库将照常设置ID。但它也会创建一个encrypted_value,它将id存储为加密ID。您可以在应用程序周围使用此加密值,以使数据库ID对接口保密。
这是控制台中的一个例子......