Token接入多模型编辑功能

Token access to edit function of multiple models

我正在开发一个应用程序,其中将向访客提供一个简短的 Base64 令牌,他们可以使用该令牌通过应用程序主页上的一个 "search form" 访问多个不同模型之一的编辑功能.

我已经创建了令牌功能并将其包含在我需要的模型的架构中。我的问题是,如何最好地使用主页上的访问令牌搜索和访问编辑功能?

我很难找到执行此操作的好方法,虽然我发现了很多关于访问令牌的信息,但其中大部分似乎与我的用例无关。

Rails 为模型 classes 提供了从父模型 class 继承的能力。然后模型可以具有共享属性,但也可以具有独特的属性。在数据库中,对于所有 classes,所有这些模型对象都存储在相同的 table 中,因此这称为单一 Table 继承或 STI。 (已记录 here 但博客文章中有更好的文档。)

如果您使用这种方法,那么您可以在父 class 中搜索所有实例以找到匹配的 objects/records。

class AccessToken < ActiveRecord::Base
  # has attribute access_token, and maybe others
end

class OneAccessibleKind < AccessToken
  # may have other attributes
end

class AnotherAccessibleKind < AccessToken
  # may have other attributes
end

您的迁移看起来像这样:

create_table :access_token do |t|
  t.string "access_token"
  t.string "type"
  # add any additional attributes of subclasses

  t.timestamps
end

然后您可以查询父 class。注意

all_models = AccessToken.where(access_token: 'a-token')

请注意,这些都将作为 AccessToken 对象(即父对象 class)返回,但您可以检查 type 属性以查看它们的基础 class是。

这可能不是最佳解决方案,但是,如果您的 class 大部分是不同的字段,因为您将有很多未使用的列。根据您的支持数据库(假设面向行 SQL)和对象数量,这可能是一个性能问题。

另一种选择是使用一对一关系,并为每个其他模型设置一个 AccessToken 模型。在这里您可以使用 STI 协会。

class AccessToken < ActiveRecord::Base
  belongs_to :owner, :polymorphic => true
end

class OneAccessibleKind < ActiveRecord::Base
  has_one :access_token, :as => :owner
end

class AnotherAccessibleKind < ActiveRecord::Base
  has_one :access_token, :as => :owner
end

像这样的迁移:

create_table :access_token do |t|
  t.string :access_token
  t.integer :owner_id, null: false
  t.string :owner_type, null: false

  t.timestamps
end

create_table :one_accessible_kind do |t|
  # any attributes for this type

  t.timestamps
end

然后你可以找到一个访问令牌并访问每个owner以获取对象。

AccessToken.where(access_token: 'a-token').map(&:owner)