2011-05-03 53 views
1

我正在尝试我的第一个连接,它生成的sql非常奇怪。Rails 3 ActiveRelation在连接中添加“为空”...我如何阻止它这样做?

我有一个收件人属于一个用户。我想查询到用户的所有收件人还没有阅读并不会被删除:

scope :unread, where(:is_read => false).where(:is_deleted => false) 
scope :unread_by_user_id, lambda { |id| unread.joins(:user).merge(User.by_id(id)) } 

这是它生成的SQL:

SELECT `recipients`.* FROM `recipients` INNER JOIN `users` ON `users`.`id` IS NULL WHERE `recipients`.`is_read` = 0 AND `recipients`.`is_deleted` = 0 AND `users`.`id` = 475 

有没有什么办法可以摆脱“IS NULL”?这不应该在那里:(

我试着搜索谷歌,它实际上真的很神奇,95%的例子没有谈论连接。我发现使用&语法的几个例子,这个文档实际上相当糟糕,其实很奇怪,

无论如何,我无法得到这个工作,当你开发软件的时候绝对不是一个好日子。 19年,并不能让sql加入到一张桌子上:(我可以用15个连接在sql中编写查询,手动没有问题,我想这是你在学习新框架的时候付出的代价,这并不奇怪尽管在休眠:/

回答

2

假设你有你的用户已经进账:

user.recipients.unread 

收件人协会已经限制收件人给该用户。有一个单独的范围对我来说没有意义。

--edit

这个工作,如果您的用户模型定义has_many :recipients关联。

+0

我想我想通了。由于导轨的默认设置,其中一名同事是'用户',而不是'接受者'。所以那个伎俩。我习惯于在一个地方看到所有的映射配置......所以习惯于rails实际上是一个有点挑战,因为它分散在不同的地方(迁移和2个模型,而不是1个文件)。无论如何,你的上面的代码将不幸工作,因为我想要的私人消息,而不是收件人对象:/所以我必须按照我这样做的方式。 – egervari 2011-05-03 05:26:12

+0

提及关于消息/简化模型代码的问题会给你更好的答案。 ;) – Heikki 2011-05-03 05:33:07

+0

是的,我的坏。这个范围只是达到目的的手段 - 它不应该是最终的查询 - 只是更大查询的一部分。 – egervari 2011-05-03 05:49:03

相关问题