假设您有一家餐厅,客户可以根据具体原因提出建议。 e.g。美味的食物,漂亮的座位,灿烂的笑容等等。
对于我想知道的单个服务器:
我已经实施acts_as_taggable_on
来标记每个提示。模型是:
# Tip -> Tagging <- Tag
class Tip
has_many :taggings, :as => :taggable
has_many :base_tags, :through => :taggings, :source => :tag
attr_accessible :amount_cents, :recipient_id
end
class Tagging
belongs_to :taggable
belongs_to :tag
end
class Tag
has_many :taggings
attr_accessible :name
end
问题:以下两个查询有效。但我有预感,应该可以将两个计算组合成一个查询:
Tip.joins(:taggings, :base_tags).where(recipient_id: server.id).group('tags.name').sum(:amount_cents)
# => {"great-service" => 2400, "strong-coffee" => 4500}
Tip.joins(:taggings, :base_tags).where(recipient_id: server.id).group('tags.name').count
# => {"great-service" => 6, "strong-coffee" => 9}
有什么想法吗?
答案 0 :(得分:1)
您可以运行查询一次,然后使用Ruby方法进行计算:
results = Tip.joins(:taggings, :base_tag).where(recipient_id: server.id).all
total_sum = results.map(&:amount_cents).sum
total_count = results.count
答案 1 :(得分:1)
5年后-我建议,考虑到使用数据库视图还是实体化视图。
一种选择是使用Scenic。这是一个与ActiveRecord集成在一起的Rubygem,用于在Rails中创建和管理数据库视图。