我正在读这篇文章:https://www.salsify.com/blog/engineering/eager-loading-calculations-database-views-in-rails
我真的很喜欢创建一个模型的概念,这个模型实际上是对另一个模型的查询,以便创建一些计算。
目前我想要做的很简单,对于每个标记,我希望获得TagVisits并对访问属性求和。
代码如下所示:
class TagVisitSummary < ApplicationRecord
belongs_to :tag
default_scope { set_from_clause }
def ==(other)
self.class == other.class && attributes == other.attributes
end
alias :eql? :==
def hash
attributes.hash
end
private
def self.set_from_clause
query = TagVisit.select(:tag_id).group(:tag_id).select('SUM(visits) as total_visits').all
from("(#{query.to_sql}) AS #{table_name}")
end
def self.columns
cols = [ActiveRecord::ConnectionAdapters::Column.new('tag_id', nil, :integer)]
cols << ActiveRecord::ConnectionAdapters::Column.new("total_visits", nil, :integer)
cols
end
end
当我将set_from_clause
中生成的SQL直接粘贴到我的Postico中时,我看到的正是我想要的结果。不幸的是,运行TagVisitSumamry.all
不会产生任何结果(也不会产生错误)。因此,我对self.columns
方法是否正确产生了一些疑问。示例是在Rails 4中,我使用的是5。是否有一些更改需要我更改此方法?
谢谢
发布于 2018-07-23 01:15:15
你试过了吗,scenic?https://github.com/thoughtbot/scenic
它有助于创建数据库视图和物化视图,您可以将它们用作ActiveRecord模型。
https://stackoverflow.com/questions/51465025
复制相似问题