在视图中迭代多步关联的Rails方法是什么?

时间:2010-10-05 17:22:46

标签: ruby-on-rails ruby-on-rails-3

我有一个带产品的Rails 3项目。

:product has_many :product_properties
:product has_many :properties, :through => :product_properties

:product_property belongs_to :product
:product_property belongs_to :property

:property has_many :product_properties
:property belongs_to :property_type

在:property_type和:property。

上有一个属性“sequence”

我想按顺序在这两个级别显示这些。我能想到的唯一方法是在模型中循环遍历它们,并将序列号放在哈希中,以便我可以对其进行排序。非常非常难看。

我知道我可以在has_many关系中添加一个“命令”,但这并不能解决来自我的多对多关系的属于我的belongs_to排序。

我认为我需要使用哈希的原因是因为我希望我的显示器是:

物业类型1 * **
 *财产1:价值
 *财产2:价值
 *财产3:价值

物业类型2 * **
 *财产4:价值
 *财产5:价值

如果我遍历整个集合,我将获得我的属性类型的重复,除非我在那里放置一些丑陋的“先前值”和“当前值”比较。

2 个答案:

答案 0 :(得分:0)

我有一些想法,不确定它们是否有用,而且我还在使用rails 2.3

创意1- 添加到您的模型 default_scope:order => '序列'

创意2 -

Product.find(:all,:include => {:product_properties => {:properties =>:property_type}},:order =>“products.sequence,property_types.sequence”)

注意:查询中的表可能不会被称为property_types,但是您可以查看日志并查看rails提供的别名。

最后的手段

a.sort_by {| a | a}

(无需创建哈希)

答案 1 :(得分:-1)

这是我最终做的事情。它是“:has_many,:through”关系和AREL的组合,它允许我以一种漂亮的方式显示嵌套关系而无需大量代码。

<% for pt in PropertyType.where("name not in ('Interchanges','Description')").order(:name) %>
    <% next unless pt.product_properties.where(:product_id => @product.id).first %>
    <h2><%= pt.name %></h2>
    <p>
        <% for pp in @product.product_properties.includes(:property).order("properties.name") %>
            <%= pp.property.name %>: <%= pp.value %><br />
        <% end %>
    </p>
<% end %>