ruby 如何使用.order而不是.sort_by对模型进行排序?

im9ewurl  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(148)

产品具有许多产品属性:

class Product < ApplicationRecord
  has_many :product_attributes
end

class ProductAttribute < ApplicationRecord
  belongs_to :product
end

我可以用sort_by对它进行排序:

@products.includes(:product_attributes).to_a.sort_by do |product|
  product.product_attributes.find_by(title: "Volume").value.to_i
end

是否可以使用order方法进行相同的排序?
我不明白如何按特定属性标题排序(如“卷”等)。

@products = Product.includes(:product_attributes).order( ??? )

下面是类似的问题:
Rails - Sort by join table data
也许我没有看到明显的东西,但我认为它没有回答我的问题。我不是通过属性名称,而是通过属性值来选择项,比如“Volume”。换句话说,我通过标题为“Volume”的属性值来选择find_by(请看上面的代码)。我不明白如何使用order进行这样的选择。

h9vpoimq

h9vpoimq1#

请尝试以下内容

class Product < ApplicationRecord
  has_many :product_attributes
end

class ProductAttribute < ApplicationRecord
  belongs_to :product
end

Product.includes(:product_attributes)
    .where(product_attributes: {title: "Volume" })  
    .order('product_attributes.title ASC')

按两个级别深的关联排序的引用。
Rails order by association field
Rails参考,查询具有条件的关联记录
Rails, querying associated records with conditions
您还可以使用带参数的范围,如下所示

class Product < ApplicationRecord
  has_many :product_attributes

  scope :sort_by_product_attribute_title, ->(title){
    includes(:product_attributes)
        .where(product_attributes: {title: title }) 
        .order('product_attributes.title ASC')  }  
end

class ProductAttribute < ApplicationRecord
  belongs_to :product
end

Product.sort_by_product_attribute_title("Volume")
n1bvdmb6

n1bvdmb62#

有几种不同的可能解决方案-其中之一是使用ON子句中的附加限制执行自定义联接:
第一个
其他可能的解决方案是使用子查询或横向连接从product_attributes表中选择正好与volume属性相对应的行。

相关问题