【发布时间】: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