【问题标题】:ActiveRecord: Read Only Model based on QueryActiveRecord:基于查询的只读模型
【发布时间】:2022-11-22 04:13:45
【问题描述】:

我过去曾使用 Postgres 视图对数据的派生表示进行建模。

覆盖 ActiveRecord 的 readonly? 有助于实现它。

不幸的是,当习惯于大量使用时,视图的缺点是很难进行架构更改。

所以我想知道是否有办法将任意查询分配给模型并将其视为表?

编辑:对不起,我应该更清楚:

我想要的是通过名为“UserWithComments”的模型执行类似“给我所有加入他们的 cmets 的用户”之类的操作。我知道这个特定的例子可以通过 User.includes(:comments) 或类似的方式使用 ActiveRecords DSL 轻松实现。

如果查询变得更加复杂,ActiveRecord DSL 达到了它的极限,所以我可以只用我的 SQL 创建一个视图,然后使用一个引用该视图的只读模型。在某些情况下,创建视图是不可行的,所以我想知道如何创建一个名为 UserWithComments 的模型,该模型未链接到表或视图,而是具有某种带有 SQL 的配置选项,如 select <attributes> from users u left join comments c on c.user_id = u.id

【问题讨论】:

  • 你是什​​么意思使查询只读?只有在您提供相应功能的情况下,用户才能对数据进行更改。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

您的问题有点含糊,但我以这种方式使用了视图:

在数据库中创建您的视图。我正在使用一个名为 gear_alerts 的示例。然后在 Rails 中创建一个名为 gear_alert.rb 的模型:

class GearAlert < ApplicationRecord
  self.primary_key = :id
 
  belongs_to :category
  belongs_to :user
  has_many :user_tags, through: :user
  scope :active, -> { where(active: true) }
  scope :deactivated, -> {where(active: false) }

  def readonly?
    true
  end
end

如您所见,由于视图将自己呈现为普通 ActiveRecord 存储的表,因此您可以在只读上下文中将其视为此类。当我使用复杂的表连接时,我喜欢在进入表示层之前必须大量操作的视图。将所有内容留给浏览器渲染确实会减慢速度。保持观点可能会很痛苦。所以我强烈推荐 Scenic gem https://github.com/scenic-views/scenic,因为它可以让您轻松地从 Rails 迁移工具修改视图,同时还为您提供视图随时间修改的历史记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2011-10-16
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多