rails自定义函数

时间:2016-08-30 20:04:16

标签: ruby-on-rails activerecord associations has-many

考虑以下模型

class User < AR
   has_many :resources
end

class Resource < AR
   belongs_to :user
end 

我需要在应用某些功能后保存外键。因此,资源表中user_id的值与users表中的id不匹配,但可以从id再次计算。

如何定义关联?我们假设函数是dummy_func()。

3 个答案:

答案 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对接口保密。

这是控制台中的一个例子......

Example in Console