代码之家  ›  专栏  ›  技术社区  ›  Chloe

如何从has\u many关系的作用域返回单个值?

  •  0
  • Chloe  · 技术社区  · 6 年前

    如何从此作用域返回单个记录?我两种方法都试过了。

    class Subscription < ApplicationRecord
      has_many :invoices, dependent: :destroy
    
    class Invoice < ApplicationRecord
      belongs_to :subscription
    
      scope :current, -> do  
        # where(paid: nil).order(:created_at).last
        where(paid: nil).order(created_at: :desc).limit(1).first
      end
    

    第一种方式正确添加 order by ... desc limit 1 ,但随后它会执行另一个查询,而不带where条件!

    irb(主):004:0>s、 发票。现在的
    发票加载(22.0ms)选择“发票”。*“发票”中的“发票”。“subscription\u id”=$1和 “发票”。“paid”为空 按“发票”订购。“created\u at” DESC限额2美元 [[“订阅id”,16],“限制”,1]]
    发票加载(2.0ms)选择“发票”。*“发票”中的“发票”。“subscription\u id”=“1美元[[“subscription\u id”,16]]
    =>#<ActiveRecord::AssociationRelation[#<发票id:8,订阅id:16,用户id:21, 已支付:“2018-03-15” ,创建于:“2018-03-14 22:42:48”>]&燃气轮机;

    第二种方法还执行另一个查询,删除正确的结果。

    irb(主):007:0>s、 发票。现在的
    发票加载(2.0ms)选择“发票”。*“发票”中的“发票”。“subscription\u id”=“1美元”和“发票”。“paid”为空 按“发票”订购。“created\u at”DESC LIMIT$2[[“subscription\u id”,16],“LIMIT”,1]]
    发票加载(2.0ms)选择“发票”。*“发票”中的“发票”。“subscription\u id”=“1美元[[“subscription\u id”,16]]
    =>#<ActiveRecord::AssociationRelation[#<发票id:8,订阅id:16,用户id:21, 已支付:“2018-03-15” ,创建于:“2018-03-14 22:42:48”>]&燃气轮机;

    还有,我怎样才能只获得记录,而不是 ActiveRecord::AssociationRelation ?

    Ruby 5.0.6

    2 回复  |  直到 6 年前
        1
  •  1
  •   jvillian    6 年前

    您可以尝试以下操作:

    class Invoice < ApplicationRecord
      belongs_to :subscription 
    
      class << self 
    
        def for_subscription(subscription)
          where(subscription: subscription)
        end
    
        def unpaid
          where(paid: nil)
        end
    
        def newest
          order(created_at: :desc).first 
        end
    
      end
    
    end
    

    如果你有一个 Subscription 调用 @subscription 您可以使用以下选项:

    Invoice.unpaid.for_subscription(@subscription).newest
    

    我认为应该只触发一个查询,并返回一个 invoice 例子

        2
  •  -1
  •   Chloe    6 年前

    我将范围替换为

      def self.current
        where(paid: nil).order(:created_at).last
      end
    

    它成功了。但是我不知道为什么,因为这种方法 Invoice 类,而关系为 ActiveRecord::Associations::CollectionProxy 班我希望我知道它为什么会起作用。我希望知道scope为什么不起作用,并执行了两个查询。