【问题标题】:Generating an array of records from an Activerecord::Relation in Rails从 Rails 中的 Activerecord::Relation 生成记录数组
【发布时间】:2013-02-14 23:20:33
【问题描述】:

Rails 的新手,正在构建电子商务系统。

我有一个树状的产品结构 -> skus -> line_items

地点:

class LineItem < ActiveRecord::Base
  belongs_to :sku
  belongs_to :cart

class Sku < ActiveRecord::Base
  belongs_to :product

class Product < ActiveRecord::Base
  has_many :skus
  has_many :line_items, :through => :skus

Product 模型有一个布尔字段,用于确定特定产品是否需要许可证。

将多个 line_items 添加到购物车中,这样:

@cart.line_items

返回一个订单项数组。

在订单阶段,我需要确定是否有任何订单项需要许可证,如果需要,显示许可证以供接受。

我尝试过链接范围:

 class LineItem < ActiveRecord::Base
  scope :license?, joins(:sku) & Sku.license?

class Sku < ActiveRecord::Base
  scope :license?, joins(:product) & Product.license?

class Product < ActiveRecord::Base
  scope :license?, where(:license => true)



@cart.line_items.license?

即使@cart.line_items 包含 product.license 为 true 的项目,也会产生一个空数组。

我试过了:

@cart.line_items.joins(:sku).joins(:product).where(:license => true)

它返回一个 ActiveRecord::Relation,但是

@cart.line_items.joins(:sku).joins(:product).where(:rct => true).empty?
@cart.line_items.joins(:sku).joins(:product).where(:rct => true).to_a
@cart.line_items.joins(:sku).joins(:product).where(:rct => true).all

在后两种情况下都不能给出布尔值(在第一种情况下)或数组。

我可以循环遍历:

<% @cart.line_items.each do |item| %>
    <h4><%= item %></h4>
    <h4><%= item.sku.product.license %></h4>
<% end %>

并查看所有正确的布尔值,但必须有更好的方法来执行此操作,而不是在我的订单视图中使用此循环的变体,或者必须创建一个类方法来循环并生成布尔值。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails activerecord relation


    【解决方案1】:

    该产品似乎是了解它是否需要许可证的产品。在这种情况下,您需要从 line_item 一直到产品的链上去获取该信息。您可以在 LineItem 类上添加一个 needs_license? 方法,该方法委托给它的 Sku,它委托给它的产品,然后像这样过滤掉 LineItems:

    class LineItem
      def needs_license?
        sku.needs_license?
      end
    end
    class Sku
      def needs_license?
        product.needs_license?
      end
    end
    
    class Product
      def needs_license?
        license
      end
    end
    

    最后,

    @cart.line_items.select(&:needs_license?)      
    

    【讨论】:

    • 非常感谢!这非常有效,这就是我认为我正在使用链接范围所做的事情。链接的类方法显然做了不同的事情。
    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 2023-03-27
    • 2011-08-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多