在构建包含三个关联模型的rails查询时遇到问题

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的交易所做的一系列投资.

我前一段时间发布了此消息,但没有收到任何成功的回复.从那以后我自己做了几次尝试,但都遭遇了失败,所以我又回到了原点.希望我能清楚地解释我的问题.谢谢!

Zai*_*uch 5

编辑:我的不好,误读了这个问题 - 深夜后的清晨:)

试试这个:

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)