Ruby on rails 不同型号的链条和订单

Ruby on rails 不同型号的链条和订单,ruby-on-rails,Ruby On Rails,我有三种型号 属于以下项的大小::product 具有多个::尺寸且属于::类别的产品 包含多个::产品的类别 我想在我的产品索引表中对它们进行排序 按类别标题,然后按产品标题,然后按大小 Caegories | Product | Size | ---------------------------- A | A | S | A | A | M | A | B | S | A

我有三种型号

属于以下项的大小::product 具有多个::尺寸且属于::类别的产品 包含多个::产品的类别 我想在我的产品索引表中对它们进行排序 按类别标题,然后按产品标题,然后按大小

Caegories | Product | Size |
----------------------------
   A      |   A     | S    |
   A      |   A     | M    |
   A      |   B     | S    |
   A      |   C     | S    |
   B      |   A     | S    |
   B      |   A     | M    |
   B      |   B     | S    |
   B      |   C     | S    |
我怎么能把这一切都连锁订购呢?可能吗

更新

我想我宁愿从尺寸开始订购,以便显示每个尺寸。。。 但是我不知道怎么

index.html.erb

<% "my query???".each do |size| %>
    <td><%= size.product.category.title %></td>
    <td><%= size.product.title %></td>
    <td><%= size.product.price %></td>
    <td><%= size.size_name %></td>
    <td><%= size.quantity %></td>
<% end %>

我没有测试以下内容,但必须工作

我没有正确获取您的大小表架构。假设大小模型有列类型来存储像Llarge、Ssmall和Mmedium这样的值

Product.joins(:category, :sizes).order('categories.title, title, sizes.type')
确保您的关联和表架构是正确的

注意:根据您更新的模式

Product.joins(:category, :sizes).order('categories.title, title, sizes.size_name')

我没有测试以下内容,但必须工作

我没有正确获取您的大小表架构。假设大小模型有列类型来存储像Llarge、Ssmall和Mmedium这样的值

Product.joins(:category, :sizes).order('categories.title, title, sizes.type')
确保您的关联和表架构是正确的

注意:根据您更新的模式

Product.joins(:category, :sizes).order('categories.title, title, sizes.size_name')

虽然@ray的答案在很大程度上是可靠的,但我认为您需要插入一些额外的东西,以便按照预期订购尺寸,即“小、中、大”

在ray的回答中,这是按字母顺序排列的,而我想你会希望它从小到大,反之亦然

这将使您的查询看起来如下所示:

Product.joins(:category, :sizes).order("categories.title, title").order("CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC")
Size.joins(product: :category).order("CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC").order("categories.title, products.title")
为了便于阅读,我已经分别链接了CASE语句的顺序,不过您也可以执行以下操作:

Product.joins(:category, :sizes).order("categories.title, title, CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC")
就我个人而言,如果可能的话,我会更进一步,将大小存储为db中的一列:

enum size_name: [:small, :medium, :large] 
# Or enum size_name: { small: 0, medium: 1, large: 2 }
这使得代码非常简单,因为枚举列按上述顺序存储整数:

Product.joins(:category, :sizes).order("categories.title, title, sizes.size_name")
最后,这还有额外的好处:您可以访问Size.medium、Size.medium、Size.large等方法!等等:

希望这有帮助-如果您有任何问题或意见,请告诉我

根据问题的更新进行编辑

要从大小开始,您可以调整为以下内容之一:

Product.joins(:category, :sizes).order("categories.title, title").order("CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC")
Size.joins(product: :category).order("CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC").order("categories.title, products.title")
或使用枚举:


虽然@ray的答案在很大程度上是可靠的,但我认为您需要插入一些额外的东西,以便按照预期订购尺寸,即“小、中、大”

在ray的回答中,这是按字母顺序排列的,而我想你会希望它从小到大,反之亦然

这将使您的查询看起来如下所示:

Product.joins(:category, :sizes).order("categories.title, title").order("CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC")
Size.joins(product: :category).order("CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC").order("categories.title, products.title")
为了便于阅读,我已经分别链接了CASE语句的顺序,不过您也可以执行以下操作:

Product.joins(:category, :sizes).order("categories.title, title, CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC")
就我个人而言,如果可能的话,我会更进一步,将大小存储为db中的一列:

enum size_name: [:small, :medium, :large] 
# Or enum size_name: { small: 0, medium: 1, large: 2 }
这使得代码非常简单,因为枚举列按上述顺序存储整数:

Product.joins(:category, :sizes).order("categories.title, title, sizes.size_name")
最后,这还有额外的好处:您可以访问Size.medium、Size.medium、Size.large等方法!等等:

希望这有帮助-如果您有任何问题或意见,请告诉我

根据问题的更新进行编辑

要从大小开始,您可以调整为以下内容之一:

Product.joins(:category, :sizes).order("categories.title, title").order("CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC")
Size.joins(product: :category).order("CASE sizes.size_name WHEN 'SMALL' THEN 'a' WHEN 'MEDIUM' THEN 'b' WHEN 'LARGE' THEN 'c' ELSE 'z' END ASC").order("categories.title, products.title")
或使用枚举:


如果你在客户端这样做会更好。使用任何第三方插件,您可以在表中添加排序,例如您认为@Vishal?我肯定希望在后端完成这项工作……我确信,如果要以这种方式管理数据,这将非常棘手。通过这种排序,您将运行哪个查询来获取数据?我已经用我的模式和我想要的索引更新了我的问题,只是为了存储数量和大小,创建大小表是非常糟糕的。您可以将这两个值存储在products表中。如果您在客户端这样做会更好。使用任何第三方插件,您可以在表中添加排序,例如您认为@Vishal?我肯定希望在后端完成这项工作……我确信,如果要以这种方式管理数据,这将非常棘手。通过这种排序,您将运行哪个查询来获取数据?我已经用我的模式和我想要的索引更新了我的问题,只是为了存储数量和大小,创建大小表是非常糟糕的。您可以将这两个值存储在products表中。我认为他可以将大小存储在products表列中以降低复杂性。答案是根据他的要求,但对现有模式的改进可能会更好。大小是产品的一个嵌套属性。它是由管理员手动输入的,可以是小型、中型、s、m、38/40、40/42。这实际上取决于文章……嗯,在这种情况下,也许按字母顺序就足够了?在这种情况下,使用@ray的方法:或者,您可以使用类似于和的方法将位置属性添加到大小。很好,很高兴它已经启动并运行:很高兴能够提供帮助,希望从这里开始一切顺利!enum不在我的脑海中,但如果它是我的情况,我也希望更喜欢enum,解释得很好!我认为他可以在产品中储存尺寸
可扩展列以降低复杂性。答案是根据他的要求,但对现有模式的改进可能会更好。大小是产品的一个嵌套属性。它是由管理员手动输入的,可以是小型、中型、s、m、38/40、40/42。这实际上取决于文章……嗯,在这种情况下,也许按字母顺序就足够了?在这种情况下,使用@ray的方法:或者,您可以使用类似于和的方法将位置属性添加到大小。很好,很高兴它已经启动并运行:很高兴能够提供帮助,希望从这里开始一切顺利!enum不在我的脑海中,但如果它是我的情况,我也希望更喜欢enum,解释得很好!