Rails方式结合半相关数据

时间:2014-03-11 21:56:11

标签: ruby-on-rails

我有以下代码片段来获取用户已订阅的所有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做这样的事情的方式是什么?

下面是我试图做的功能明智的截图(如果用户没有订阅然后让他们订阅,否则让他们取消):

enter image description here

1 个答案:

答案 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)。当然,名字是任意的