Rails - 3个表之间的复杂数据建模关系

时间:2014-09-19 12:33:23

标签: sql ruby-on-rails ruby database rails-activerecord

我面临以下问题,我仍然是相当新的铁杆,我需要你的帮助

我有一个表 SALES ,包含4列:product_id,已售产品的数量,卖家和销售当天。

我还有其他表 PRODUCT_PRICE ,其中包含产品清单,价格和月份(基于月份的价格变化)

最后我还有其他表 PRODUCT ,其中包含产品的产品,说明和制造商ID。

我需要进行2次查询: - 前10个制造商在上个月销售更多产品   - 上个月收入增加(使用PRODUCT_PRICE表计算)的前10名卖家。

如何在Ruby on Rails中使用ActiveRecord执行此操作,我想使用rails关联来执行此操作。

谢谢!

1 个答案:

答案 0 :(得分:0)

没有任何进一步的信息,没有经过测试并且非常困难,但是如果你有三个模型设置:

首先,基于此查询:

SELECT manufacturer_id FROM products
LEFT JOIN sales ON sales.product_id = products.id
WHERE YEAR(sales.created_at) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(sales.created_at) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
LIMIT 10

这将是这样的(你没有提到你正在使用哪个版本的Rails)

@top_manufacturers = Product.find(:all,
                                  :select=> 'manufacturer_id FROM products',
                                  :joins => 'LEFT JOIN sales ON sales.product_id = products.id',
                                  :conditions => 'YEAR(created_at) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(created_at) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)',
                                  :limit => 10)

第二次

SELECT sales.seller_id, SUM(sales.quantity), SUM(product_prices.price) FROM sales
LEFT JOIN products ON products.id = sales.product_id
LEFT JOIN product_prices ON product_prices.product_id = products.id
WHERE YEAR(sales.created_at) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(sales.created_at) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
LIMIT 10

@top_sellers = Sale.find(:all,
                         :select => 'sales.seller_id, SUM(sales.quantity), SUM(product_prices.price)',
                         :joins => 'LEFT JOIN products ON products.id = sales.product_id LEFT JOIN product_prices ON product_prices.product_id = products.id',
                         :conditions => 'YEAR(sales.created_at) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(sales.created_at) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)',
                         :limit => 10)

如果您的所有表格中都没有created_atupdated_at列,那么您应该添加它们--Rails会自动填充它们,但我想我应该使用您的month列。