从Rails中的Activerecord :: Relation生成记录数组

时间:2013-02-28 16:50:14

标签: ruby-on-rails activerecord relation

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 model有一个布尔字段,用于确定特定产品是否需要许可证。

将多个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 %>

并查看所有正确的布尔值,但必须有一个更好的方法来做到这一点,比在我的顺序视图中使用此循环的变体,或者必须创建一个循环的类方法并生成布尔值。 / p>

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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?)