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