【问题标题】:Plucking an enum采摘枚举
【发布时间】:2017-11-02 16:37:05
【问题描述】:

我有一个菜有很多票的场景。每张选票都有一个类型;它要么是赞成票,要么是反对票,都是以枚举的形式。

class Dish < ActiveModel
  has_many :votes, as: :votable, counter_cache: true, dependent: :destroy
end

class Vote < ActiveModel
  self.inheritance_column = nil

  enum type: { upvote: 0, downvote: 1 }

  belongs_to :user
  belongs_to :votable, polymorphic: true
end

对于我正在做的事情,我只需要该类型的投票类型和数量。这使我认为:pluck 在这里可能有用。不幸的是,在这种情况下使用它会返回 all 票,而不是赞成票或反对票:

dish.votes.pluck(:type)
Dish Load (0.4ms)  SELECT  "dishes".* FROM "dishes" ORDER BY "dishes"."id" DESC LIMIT $1  [["LIMIT", 1]]
(0.3ms)  SELECT "votes"."type" FROM "votes" WHERE "votes"."votable_id" = $1 AND "votes"."votable_type" = $2  [["votable_id", 4], ["votable_type", "Dish"]]
 => ["downvote"]

目前这是我得到想要的结果的唯一方法:

def upvote_count
  votes.select { |v| v.upvote? }.count
end

def downvote_count
  votes.select { |v| v.downvote? }.count
end

【问题讨论】:

  • 是的,所以不要为此使用 pluck。
  • 讨厌成为一个过于乐观的人,但这是我能做到的吗?
  • Vote.where(type: 0).count 将返回赞成票的数量。
  • 取决于生成的查询类型:votes.select { |v| v.upvote }.count。显示查询。我猜它确实 not 转换为上面 Cyzanfar 显示的查询。那应该更快(尤其是在列type 上有索引)
  • @Cyzanfar 在这种情况下,我只是想从一道菜的即时与所有选票中获得计数。

标签: sql ruby-on-rails ruby enums


【解决方案1】:

枚举为每个可能的值提供范围。

def upvote_count
  votes.upvote.count
end

def downvote_count
  votes.downvote.count
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多