【问题标题】:Token access to edit function of multiple models令牌访问多个模型的编辑功能
【发布时间】:2015-02-01 22:27:19
【问题描述】:

我正在开发一个应用程序,在该应用程序中,客人将获得一个简短的 Base64 令牌,他们可以反过来使用该令牌通过应用程序主页上的一个“搜索表单”访问几个不同模型之一的编辑功能。

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

我很难找到一个好的方法来做到这一点,虽然我找到了很多关于访问令牌的信息,但其中大部分似乎与我的用例无关。

【问题讨论】:

  • 我很难理解您要完成的工作。您能否提供一些示例代码来说明这一点?
  • 目前我很难用我为该任务编写的代码级别来说明......基本上我希望完成的是:我有几个模型具有不同的列在他们的表格中,除了access_token 之外,大多数都不同。我希望找到一种方法,可以通过“access_token”搜索所有模型并打开该记录的编辑路径。 (例如:@beds.access_token)
  • 为了更好地解释 - Model.find(options) 是否有一个选项不需要知道模型 - 只是选项? (在这种情况下,例如something.find(access_token => % search input %)

标签: ruby-on-rails ruby-on-rails-4 token


【解决方案1】:

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

如果您使用这种方法,那么您可以在父类中搜索所有实例以找到匹配的对象/记录。

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

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

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

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

但是,如果您的类主要是不同的字段,这可能不是最佳解决方案,因为您将有很多未使用的列。根据您的后备数据库(假设是面向行的 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2019-09-29
    相关资源
    最近更新 更多