0

Railsでユニオンをやりたいと思いますが、この投稿Railsユニオンハックによると、2つの異なるクエリをまとめる方法はRailsではネイティブにサポートされていません。この問題に取り組むためのより良い方法があるかどうか疑問に思います。

アイテムのテーブルがあり、各アイテムには多くの価格がありますが、各アイテムに1つの価格のみを結合したいと思います。

アイテムの適切な価格を決定するために、価格モデルに2つの追加の外部キー(category_idとdiscount_id)があります。それぞれが独立してアイテムの価格を宣言できます。

元。アイテム+カテゴリ=価格1およびアイテム+割引=価格2

discount_idが渡されたIDと一致する場合、アイテム+カテゴリに一致するそのアイテムのみの価格結果を除外したいと思います。また、遅延読み込みを緩めないようにしています。

うまくいけば、問題は明らかです!そうでない場合は、事前に感謝します。

4

1 に答える 1

1

モデルは次のようになります。

class Price < ActiveRecord::Base
  belongs_to :item
  belongs_to :category
  belongs_to :discount

  scope :category, where("prices.category_id IS NOT NULL")
  scope :discount, where("prices.discount_id IS NOT NULL")
end

class Item < ActiveRecord::Base
  has_many :prices
end

class Category < ActiveRecord::Base
  has_many :prices
end

class Discount < ActiveRecord::Base
  has_many :prices
end

Priceこれを行う1つの方法は、このロジックをカプセル化するクラスメソッドを追加することです。

class Price < ActiveRecord::Base
  def self.used
    discount_items_sql = self.discount.select("prices.item_id").to_sql
    where("prices.discount_id IS NOT NULL OR prices.item_id NOT IN (#{discount_items_sql})")
  end
end

これは事実上、このクエリと同じです。

SELECT * FROM prices
WHERE prices.discount_id IS NOT NULL -- the discount_id is present on this record,
  OR prices.item_id NOT IN (         -- or no discount_id is present for this item
      SELECT item_id FROM prices WHERE discount_id IS NOT NULL)

Item簡単にするために、モデルに次のヘルパーメソッドを追加できます。

class Item < ActiveRecord::Base
  def category_price
    prices.category.first
  end

  def discount_price
    prices.discount.first
  end

  def used_price
    prices.used.first
  end
end

これで、単一のアイテムの個々の「タイプ」の価格を簡単に取得できます(nil利用できない価格の場合になります)。

item.category_price
item.discount_price
item.used_price
于 2013-01-11T04:49:53.473 に答える