我有以下代码片段来获取用户已订阅的所有ClassType,以及用户未订阅的所有ClassType,并在UI中显示它。我正在使用订阅模型,因为它会保存我向用户显示的历史价格。
@subscriptions = Subscription.where(user_id: current_user.id)
subscription_ids = @subscriptions.pluck(:class_type_id)
classtypes_not_subscribed_to = ClassType.where.not(id: subscription_ids)
classtypes_not_subscribed_to.each do |c|
@subscriptions << Subscription.new(class_type_id: c.id, price: c.price)
end
然而,这感觉就像一个黑客,Rails做这样的事情的方式是什么?
下面是我试图做的功能明智的截图(如果用户没有订阅然后让他们订阅,否则让他们取消):
答案 0 :(得分:0)
我建议您为类创建范围,它确实使代码更清晰
class Subscription
named_scope :of, lambda {|user| {
conditions: { user_id: user.id }
} }
end
class ClassType
named_scope :not_subscribed_for, lambda { |user|
subscribed_classes_ids = Subscription.of(user).all.pluck(:class_type_id)
{ conditions: ["id NOT IN ?", subscribed_classes_ids] }
}
end
然后你只需拨打ClassType.not_subscribed_for(some_user)
。当然,名字是任意的