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



我面临以下问题,我对rails还很陌生,我需要你的帮助

我有一个SALES表,其中有4列:product_id、销售产品的数量、卖家和销售日期。

我有其他表格PRODUCT_PRICE,其中列出了产品、价格和月份(价格随月份变化)

最后,我有另一个表PRODUCT,其中有产品、描述和产品的制造商id。

我需要提出两个问题:-上个月销售产品最多的十大制造商-上个月收入最高的前10名卖家(使用PRODUCT_PRICE表进行计算)。

我如何在RubyonRails中使用ActiveRecord来实现这一点,我想使用Rails关联来实现。

谢谢!

没有经过测试,在没有任何进一步信息的情况下非常困难,但如果您有三个模型设置:

首先,基于此查询:

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列。

最新更新