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

Rails活动记录:与order和group一起查找

  •  1
  • Hakanai  · 技术社区  · 17 年前

    我有一个类似这样的结构:

    class User
      has_many :dongles
      has_many :licences, :through => :dongles
    end
    
    class Dongle
      has_many :licences
      belongs_to :user
    end
    
    class Licence
      belongs_to :dongle
    end
    

    然而,随着时间的推移,用户最终会为每个加密狗获得多个许可证。合理地说,该应用程序希望总结每个许可证的最新许可证。

    user.dongles.each do |dongle|
      licence = dongle.licences.find(:first, :order => 'created_at DESC')
      # do something with the licence info
    end
    

    但是,有没有一种方法可以通过收集来做到这一点,并避免通常以天真的方式进行的大量查询?

    user.licences.find(:all, :order => 'created_at DESC', :group => 'dongle_id')
    

    按照我在查询中指定的顺序。

    有没有一种方法可以让我使用我提供的排序顺序来决定哪一个是第一个?

    2 回复  |  直到 9 年前
        1
  •  3
  •   manat    17 年前

    从您的模型中,所有关联信息都已声明。通过使用ActiveRecord执行单个查询,您实际上可以使用每个用户访问加密狗和许可证信息 选项。

    # Say the table name is licences and dongles.
    users = User.find(:all, 
      :include => [:dongles, :licences], 
      :order => "licences.created_at DESC, dongles.created_at DESC")
    

    我假设您想创建每个用户拥有的每个加密狗的最新许可证摘要。你可以根据自己的实际需求来减少循环。

    users.each do |user| 
      # do something with your user info
      user.dongles.each do |dongle|
        # do something with your dongle info
        licence = dongle.licences.first
        # do something with the licence info
      end
    end
    

    更多信息请访问 http://snippets.dzone.com/posts/show/2089

        2
  •  -1
  •   Jimmy Stenke    17 年前

    您是否尝试过使用默认作用域? 首先,您可以尝试在has_many中添加顺序,如我在User中所示。

    class User
      has_many :dongles
      has_many :licences, :through => :dongles, :order => 'created_at DESC'
    end
    

    然而,我不确定这是否真的适用于多个关联,也许,如果不起作用,你可以尝试将其添加到Dongle中的关联中。

    class Dongle
      has_many :licences, :order => 'created_at DESC'
      belongs_to :user
    end
    

    第二种选择是尝试使用默认作用域,如我在许可证中所示。

    class Licence
      default_scope :order => 'created_at DESC'
      belongs_to :dongle
    end
    

    user.licenses.find(:first)

    推荐文章