xxy*_*yxx 1 ruby activerecord ruby-on-rails
我有三个机型我的工作:User,Deal,和Investment.
用户
User has many :deals
User has many :investments
Run Code Online (Sandbox Code Playgroud)
合同
Deal has many :investments
Deal belongs to :user
Run Code Online (Sandbox Code Playgroud)
投资
Investment belongs to :user
Investment belongs to :deal
Run Code Online (Sandbox Code Playgroud)
(这些是我在这些模型之间建立的唯一关联)
假设我有一个用户记录'u',并且Deal有一个名为的属性funding_type_id.
我想找到用户'你'所做的所有投资investment.deal.funding_type_id == 3.
或者更清楚:投资是由用户进行的交易.我是用户'你'对资金类型id为3的交易所做的一系列投资.
我前一段时间发布了此消息,但没有收到任何成功的回复.从那以后我自己做了几次尝试,但都遭遇了失败,所以我又回到了原点.希望我能清楚地解释我的问题.谢谢!
编辑:我的不好,误读了这个问题 - 深夜后的清晨:)
试试这个:
investments = Investments.joins(:deal).where(user_id: u.id, deals: { funding_type_id: 3 })
Run Code Online (Sandbox Code Playgroud)
这应该生成以下SQL(subing in 1for u.id):
SELECT "investments".* FROM "investments"
INNER JOIN "deals" ON "deals"."id" = "investments"."deal_id"
WHERE "investments"."id" = 1 AND "deals"."funding_type_id" = 3
Run Code Online (Sandbox Code Playgroud)
哪个应该给你你想要的行.
如果您在和之间设置has_many :through关联(请参阅" 关联基础指南"),您可以直接访问属于用户的所有交易:UserDeal
# user.rb
has_many :deals, through: :investments
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用以下方式获取特定用户的所有交易:
user_deals = User.deals
Run Code Online (Sandbox Code Playgroud)
您可以选择在其上添加where条件以限制它的方式.u您想要交易的用户在哪里:
deals = u.deals.where(funding_type_id: 3)
Run Code Online (Sandbox Code Playgroud)