2017-03-15 33 views
0

我正在开发一个项目,我有一个用户,一个用户有一个UserSetting。我想获取User.user_setting.status =='active'的用户。我在那一刻:根据关联属性获取记录

User.joins(:user_setting).where(:user_setting => {:status => 'active'}) 

,但它似乎没有工作,我得到的错误

Unknown column 'user_setting.status' in 'where clause' 

如果有人能帮助我,我要去哪里错了,将不胜感激。

+0

啊,我当然可以。 UserSettings返回UserSettings(id:integer,status:string,user_id:integer,created_at:datetime,updated_at:datetime)' – user2320239

+1

'用户'不应该是'User'?错字?所以,在user.rb中你有'has_one:user_settings'?复数? – Ursus

+1

您错误地命名模型。用户表应该由User模型管理,而不是由User模型管理,user_settings应该映射到UserSetting模型而不是UserSettings模型。对于Rails来说,模型名称必须是* singular *,以便自动选择正确的表格,而不是复数形式。解决这些问题,并看看是否有帮助。 – meagar

回答

1
User.joins(:user_setting).where(user_settings: { status: 'active' }) 

joins你应该使用协会名称,而where子句中,你应该使用的数据库表名(这是user_settings,不user_setting)。

编辑

如果不想接收所产生的集合中重复的条目,您可以使用GROUP BY条款:

User.joins(:user_setting) 
    .where(user_settings: { status: 'active' }) 
    .group('users.id') 

另一种选择是使用includes代替joins

User.includes(:user_setting) 
    .where.not(user_settings: { id: nil }) 
    .where(user_settings: { status: 'active' }) 
+1

谢谢,当我被允许时,我会接受你的回答。 – user2320239

+0

我不知道Rails 5,但在以前的版本中,使用AR的'joins'方法将使用SQL'INNER JOIN',之后会在AR :: Relation中进行重复。使用'includes'&'references'代替 – MrYoshiji

+0

@MrYoshiji是的,在Rails 5 AFAICT中连接仍然会产生重复。我个人使用'includes'或'joins' +'group('users.id')' –

相关问题