3

您好我正在尝试对产品及其属性进行排序,但问题是属性的标题不是基于产品的名称和描述。所以例如我有:

Product id | attribute 1 name | attribute 1 desc | attribute 2 name | attribute 2 desc
1001       | screen size      | 15"              | DCR              | 10,000:1
1002       | DCR              | 200,000:1        | Widescreen       | yes

这一行一直持续到产品有多少属性。

我需要的是会吐出的东西:

Product id, attribute 1 name, attribute 1 desc
Product id, attribute 2 name, attribute 2 desc

所以它看起来像这样:

1001, screen size, 15"
1001, DCR, 10,000:1
1002, DCR, 200,000:1
1002, widescreen, yes

有谁知道对这些信息进行排序的最佳方法是什么?

我一直在尝试一些 excel vba 脚本,但我想知道是否有办法用 ruby​​ 来做这件事,因为这就是我现在正在学习的东西,这将是一个很好的现实世界的例子来深入研究 ruby​​。

4

3 回答 3

0

您可以通过将属性分离到它们自己的模型中来大大简化此过程。

应用程序/模型/product_attribute.rb

class ProductAttribute < ActiveRecord::Base
  attr_accessible :name, :desc, :product_id
  belongs_to :product
  #...
end

应用程序/模型/product.rb

class Product < ActiveRecord::Base
  # ...
  has_many :product_attributes
  # ...

  def self.sorted_attributes
    Product.all.collect{|prod| prod.sorted_attributes}
  end      

  def sorted_attributes
    product_attributes.all(order: "name ASC").collect{|attr| [self.id, attr.name, attr]}
  end
end

然后,您将能够通过调用 Product.sorted_attributes 并编写视图代码来获得所需的信息以显示生成的二维数组。

于 2012-11-30T19:54:06.560 回答
0

这是约翰·布斯托斯在评论中提到的内容的充实版本。

我正在使用此示例数据(此处为完整工作簿

样本数据

这个想法是使用 VBA 循环遍历成对的列,并将它们输出到一个又长又瘦的表中。

Sub MakeSkinny()
    Dim rng As Range
    Dim clOutput As Range
    Dim cl As Range

    Set rng = Range("A3").CurrentRegion ' raw data'
    Set clOutput = Range("A9") ' Where to output results'

    Set cl = clOutput
    ' Add headers to the new table'
    cl.Offset(0, 0).Value = "Item"
    cl.Offset(0, 1).Value = "Attribute"
    cl.Offset(0, 2).Value = "Value"
    Set cl = cl.Offset(1, 0) ' go to the next row of output'

    For i = 2 To rng.Rows.Count
        iCol = 2 ' Start at column 2'
        Do Until iCol >= 7 ' set to however many cols you have'
            'Check for blank attribute name'
            If rng.Cells(i, iCol) <> "" Then
                cl.Offset(0, 0) = rng.Cells(i, 1) ' Item ID'
                cl.Offset(0, 1) = rng.Cells(i, iCol) ' Attribute Name'
                cl.Offset(0, 2) = rng.Cells(i, iCol + 1) ' Attribute Value'
                Set cl = cl.Offset(1, 0) ' go to the next row of output'
            End If
            iCol = iCol + 2 'Advance to next set of attributes'
        Loop
    Next i
End Sub

希望有帮助!

于 2013-06-20T00:27:35.873 回答
0

谢谢您的帮助。其实我前一阵子就想通了。我只是对 lineemup 宏做了一些细微的调整

Sub lineemupSAS()

Dim i As Long

Dim dr As Long

For i = 2 To Cells(2, Columns.Count).End(xlToLeft).Column Step 2

dr = Cells(Rows.Count, 1).End(xlUp).Row + 1

Cells(2, 1).Resize(6500).Copy Cells(dr, 1)

Cells(2, i).Resize(6500).Copy Cells(dr, 2)

Cells(2, 1 + i).Resize(6500).Copy Cells(dr, 3)

Next i

End Sub

其中 6500 表示数据集中的行数。

于 2013-06-21T00:57:52.303 回答