代码之家  ›  专栏  ›  技术社区  ›  Bryan Ward

关联模型中的Rails排序依据

  •  40
  • Bryan Ward  · 技术社区  · 15 年前

    我有两个模型在一个有很多关系,这样日志有很多项目。然后Rails会很好地设置如下内容: some_log.items 它将所有相关项返回到某个日志。如果我想基于项目模型中的不同字段来订购这些项目,有没有一种方法可以通过类似的构造来实现这一点,或者必须将其分解为以下内容:

    Item.find_by_log_id(:all,some_log.id => "some_col DESC")
    
    4 回复  |  直到 8 年前
        1
  •  74
  •   Greg Campbell    15 年前

    有多种方法可以做到这一点:

    如果希望以这种方式对该关联的所有调用进行排序,则可以在创建关联时指定排序,如下所示:

    class Log < ActiveRecord::Base
      has_many :items, :order => "some_col DESC"
    end
    

    您也可以使用一个命名的_scope来执行此操作,它允许在访问任何时间项时轻松指定排序:

    class Item < ActiveRecord::Base
      named_scope :ordered, :order => "some_col DESC"
    end
    
    class Log < ActiveRecord::Base
      has_many :items
    end
    
    log.items # uses the default ordering
    log.items.ordered # uses the "some_col DESC" ordering
    

    如果您总是希望在默认情况下以相同的方式订购项目,则可以使用(rails 2.3中的new)默认_scope方法,如下所示:

    class Item < ActiveRecord::Base
      default_scope :order => "some_col DESC"
    end
    
        2
  •  16
  •   random-forest-cat    8 年前

    Rails 4.2.20 语法要求用块调用:

    class Item < ActiveRecord::Base
      default_scope { order('some_col DESC') }
    end
    

    这也可以用另一种语法编写:

    default_scope { order(some_col: :desc) }
    
        3
  •  4
  •   erik    15 年前

    这两种方法都可以:

    Item.all(:conditions => {:log_id => some_log.id}, :order => "some_col DESC")
    some_log.items.all(:order => "some_col DESC")
    
        4
  •  3
  •   Sayuj    13 年前

    设置 default_scope 在你的模型课上

    class Item < ActiveRecord::Base
      default_scope :order => "some_col DESC"
    end
    

    这会起作用