[英]How to destroy a record when there is many-to-many relationship in ruby on rails?
[英]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_by
或array.sort
。
希望这个对你有帮助 :)
该查询获取所有文章,并渴望加载其方面,并按文章名称和后继名称对它们进行排序:
@articles = Article.all(:include => [ :aspects ], :order => "articles.name asc, aspects.name asc")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.