我过去曾使用过Postgres视图来建模数据的派生表示。
覆盖ActiveRecord的readonly?
有助于实现这一点。
不幸的是,当用于大量视图时,它的缺点是很难进行模式更改。
所以我想知道是否有一种方法来分配一个任意查询到一个模型,并把它当作一个表?
编辑:对不起,我应该更清楚:
我想做的是像"给我所有剩下的用户加上他们的评论"通过一个名为"userwithcomments"的模型。我知道这个特殊的例子可以很容易地通过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
你的问题有点模糊,但我用这种方式使用视图:
在DB中创建视图。我使用一个名为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迁移工具修改视图,同时还提供视图随时间修改的历史记录。