0

我想我想在 Rails 中做一个联合,但是根据这个 post rails union hack,如何将两个不同的查询拉在一起,Rails 本身并不支持联合。我想知道是否有更好的方法来解决这个问题。

我有项目表,每个项目都有很多价格,但我只想为每个项目加入一个价格。

为了确定商品的正确价格,我在价格模型中有两个额外的外键: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封装此逻辑的类方法:

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 回答