因为我对 Rails 的了解比 SQL 还新,所以我采取了捷径来构建一个相当复杂的(对我来说,无论如何)查询。
好消息:我的查询工作正常
坏消息:我被 hackish 代码困住,无法弄清楚如何将动态变量放入其中(如果它采用 Rails 友好格式,这应该很容易)。
这是我的查询(为便于阅读而分解):
ActiveRecord::Base.connection.select_all( "SELECT DISTINCT ps.* FROM merchants merch, product_sales ps, users u, user_merchant_relations umr, memberships m
INNER JOIN marketing_efforts me ON me.id = ps.marketing_effort_id
LEFT OUTER JOIN member_sales ms ON me.id = ms.marketing_effort_id
LEFT OUTER JOIN crm_sales cs ON me.id = cs.marketing_effort_id
WHERE ((me.start < '2013-05-26' AND me.end > '2013-05-26') OR (me.start < '2013-05-26' AND me.end IS NULL)) AND (me.num_avail IS NULL OR me.num_avail > 0) AND (me.gender IS NULL OR me.gender = u.gender OR u.gender IS NULL) AND ((u.birthdate > me.birthdate_start AND u.birthdate < me.birthdate_end) OR (u.birthdate > me.birthdate_start AND me.birthdate_end IS NULL) OR (me.birthdate_start IS NULL AND me.birthdate_end IS NULL) OR u.birthdate IS NULL) AND ((ms.member_id = m.member_id AND m.user_id = u.id) OR ms.member_id IS NULL) AND (cs.crm_tier_id = umr.crm_tier_id OR cs.crm_tier_id IS NULL) AND u.id = 3 AND merch.id = 1")
出现“2013-05-26”的任何地方我都需要访问 Time.now。最后的 u.id 和 merch.id 也需要接受变量。
我以为我可以简单地做: .S=?...Q=?....L=?...", value, value, value) 但这不起作用。
更新
我在这:
ProductSale.joins('INNER JOIN marketing_efforts ON marketing_efforts.id = product_sales.marketing_effort_id').joins('LEFT OUTER JOIN member_sales ON marketing_efforts.id = member_sales.marketing_effort_id').joins('LEFT OUTER JOIN crm_sales ON marketing_efforts.id = crm_sales.marketing_effort_id')
所以我正在处理所有的连接,但我遇到的问题是,使用原始 SQL,我可以轻松定义我需要访问的所有表......例如:
FROM merchants merch, product_sales ps, users u, user_merchant_relations umr, memberships m
而我不确定如何使用 Rails 做到这一点。结果,我得到FROM product_sales
:
ProductSale Load (0.3ms) SELECT "product_sales".* FROM "product_sales" INNER JOIN ....
因此,例如,当我尝试说时,users.id = 1
我得到:
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.id:
有什么想法吗?谢谢你。