繁体   English   中英

如何在Rails中的Ruby中以多对多关系对对象进行排序?

[英]How to sort objects in a many-to-many relationship in ruby on rails?

我已经尝试解决这个问题了几个小时,但还没有一个干净的解决方案。 似乎我对Rails不太满意...

无论如何,我有以下几点:

图

在代码中:

class Article < ActiveRecord::Base
  has_many :line_aspects
  has_many :aspects, :through => :line_aspects
  #plus a 'name' field
end

class LineAspect < ActiveRecord::Base
  belongs_to :article
  belongs_to :aspect
  #plus a 'value' field
end

class Aspect < ActiveRecord::Base
  has_many :line_aspects
  has_many :articles, :through => :line_aspects
  #plus a 'name' field
end

现在,我想分两步对它们进行排序。 首先按Articles.name对其进行排序,然后按Aspect.name对其进行排序(注意,不是中间人)。

例如,按字母顺序(如果表示法不正确,则表示抱歉):

[{
   article => 'Apple',
   line_aspects => [
      {:value => 'red'}, #corresponding to the Attribute with :name => 'color'
      {:value => 'small'} #corresponding to the Attribute with :name => 'shape'
   ]
},{
   article => 'Watermelon',
   line_aspects => [
      {:value => 'green'}, #corresponding to the Attribute with :name => 'color'
      {:value => 'big'} #corresponding to the Attribute with :name => 'shape'
   ]
}]

同样,请注意,这些顺序是由外观名称(形状前的颜色)而不是每行的特定值(绿色前的红色)排序的。 我的意图是将它们显示在视图的表格中。

结果如下:

表

这是我正在使用的代码:

<table>
  <tr>
    <th>Category</th>
    <% @articles.each do |article| -%>
      <th><%= link_to article.name, article -%></th>
    <% end -%>
  </tr>

  <% @aspects.each do |aspect| -%>
    <tr>
      <td><%= aspect.name -%></td>

      <% aspect.line_aspects.each do |line_aspect| -%>
        <td><%= line_aspect.value %></td>
      <% end -%>
    </tr>
  <% end -%>
</table>

我还没有找到在Rails中执行此操作的好方法(不求助于N个查询)。 谁能告诉我这样做的好方法(即使我的方法错误,也可以更改视图)?

(我在连字符中发现了类似的问题

更新:这是我在SQL中的操作方式:

SELECT line_aspects.value FROM line_aspects, aspects, articles 
WHERE articles.id = line_aspects.article_id 
   AND aspects.id = line_aspects.aspect_id
ORDER BY aspects.name, articles.name

但是我想用滑轨的方式来做。

更新:添加了视图代码。 这可能会更好地暴露我的困境。

在尝试了另一个答案之后,我找到了一种从模型中进行操作的方法。 我不确定这是否是Right Way™,但这似乎是一个可行的解决方案(让数据库引擎对其进行排序)。

在Aspect模型中,我更改了这一行:

has_many :line_aspects

变成这个:

has_many :line_aspects, :include => :article, :order => 'articles.name'

不过,如果可能的话,我仍然想听到更多人的来信。

这只是部分解决方案,因为它不能完全解决您的问题。

您可以使用named_scope通过相应的字段对模型进行排序。 named_scope :ordered, :order => "name ASC"内容: named_scope :ordered, :order => "name ASC"

这是一个简单的解决方案(至少在语法方面,不确定复杂性)。 我可以预见的唯一问题是,您无法将多个named_scopes组合在一起以在单个查询中进行排序。

对于第二种排序,可以对获得的集合使用Enumerable#sort_byarray.sort

希望这个对你有帮助 :)

该查询获取所有文章,并渴望加载其方面,并按文章名称和后继名称对它们进行排序:

@articles = Article.all(:include => [ :aspects ], :order => "articles.name asc, aspects.name asc")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM