【问题标题】:Rails 3, adding joins to default_scope for association of current_userRails 3,将连接添加到 default_scope 以关联 current_user
【发布时间】:2013-09-13 01:02:07
【问题描述】:

在我的应用程序中,我有一个用户和票证的架构,每个用户都可以订阅许多票证,反之亦然。

对于我从数据库中获取的每张票,我想显示 current_user 是否订阅了票本身。

我的查询示例如下:

@tickets = current_user.tickets.limit(10).order('created_at DESC')

我可以在 Ticket 模型中使用带有连接的 default_scope 吗?我需要它返回一个带有简单 true 或 false 或 nil 的附加字段。

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rails-activerecord


    【解决方案1】:

    示例 1 - 确定个人票证是否已订阅:

    ticket = Ticket.find(id)
    @ticket_is_subscribed = current_user.tickets.any? { |t| t == ticket }
    

    示例 2 - 如果您只想要一个包含当前用户订阅的所有票证 ID 的数组:

    subscribed_ids = current_user.tickets.pluck(:id)
    @ticket_is_subscribed = subscribed_ids.include?(ticket.id)
    

    示例 3 - 您可以生成一个数组数组,为每个 ticket.id 提供 truefalse

    subscribed_ids = current_user.tickets.pluck(:id)
    @all_subscribed_tickets = Ticket.all.pluck(:id).map { |id| [id, subscribed_ids.include?(id)] }
    

    【讨论】:

    • 谢谢depa,但是,这样有效吗?如果我拿了一千张票,在最坏的情况下,它会做 1000 次比较的平方吗?
    • pluck检查第二个例子。
    • 我认为最有效的方法是尽可能多地处理数组,而不是 ActiveRecord 集合。例如,您可以生成一个数组数组,为每个ticket.id 提供truefalse
    • 谢谢你,depa,你的 pluck 新例子非常适合我的目的,我已经在另一个系统中用 php 做了类似的事情,但是因为我不久前正在学习 rails,所以我的脑袋被填满了有东西,不记得了
    • 是的,pluck 非常适合将集合提取到数组中。
    【解决方案2】:

    这个问题有点含糊,所以我想你的情况是你拿了一堆票并显示当前用户是否有它。如果有,显示“是”,否则显示“现在”。

    你可以在 Ticket 中有一个模型方法来判断它。

    class Ticket < ActiveRecord::Base
      def is_buyer?(buyer)
        user == buyer ? "yes" : "no"
      end
    end
    
    # In controller
    @tickets = Ticket.page(1)
    
    # In view
    - @tickets.each do |ticket|
      = ticket.name
      = ticket.is_buyer?(current_user)
    

    【讨论】:

      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      相关资源
      最近更新 更多