1

Railsはかなり新しく、eコマースシステムを構築しています。

私は製品のツリーのような構造を持っています->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

製品モデルには、特定の製品にライセンスが必要かどうかを決定するブールフィールドがあります。

複数の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 :: Relationshipを返しますが、

@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

すべてがブール値(最初のケース)または配列(次の2つのケース)のいずれかを与えることに失敗します。

私はループすることができます:

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

正しいブール値をすべて表示しますが、注文ビューでこのループのバリエーションを使用するか、ループしてブール値を生成するクラスメソッドを作成するよりも、これを行うためのより良い方法が必要です。

何か案は?

4

1 に答える 1

2

ライセンスが必要かどうかを理解しているのは製品のようです。その場合、その情報を取得するには、line_item から製品までチェーンを上る必要があります。その Sku に委任するクラスにneeds_license?メソッドを追加し、その製品に委任してから、次のように LineItems を除外できます。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?)      
于 2013-02-28T16:58:29.953 に答える