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)
我正在开发一个应用程序,其中将向访客提供一个简短的 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)