新手问题 Rails Model 中 has_one 关系如何加载 conditions

zxzllyj · 2016年04月05日 · 最后由 zxzllyj 回复于 2016年04月06日 · 1945 次阅读

如题: 遇上这样一个问题, 存在三个表:user namespace group 其中,group是单表继承的namespace ,通过在其中,user和namespace的对应关系为has_one, user与group的关系为has_many 因为业务调整,先在需要将namespace中的type字段调整为group,然后新增一个namespace给用户,就出现了这样一个问题: 修改为group后 group的 id比namespace的id要小 这就导致通过关系查询user的namespace查找出的是group的问题,其生成的sql如下:

SELECT `namespaces`.* FROM `namespaces` WHERE `namespaces`.`id` = 用户id LIMIT 1

关系中指定了限制条件

has_one :namespace, dependent: :destroy, foreign_key: :owner_id, class_name: "Namespace", conditions: 'type IS NULL'

明显,限制条件 type is NULL没有生效,但是,如果将has_one改为 has_many 限制条件就生效了

请问,如何才能是has_one的限制条件生效 通过google 和查询文档,确定 conditions=>{:type=> nil}这样的写法支持但并未生效,该文档指定的rails版本为3.2.13 注:我的rails版本是3.2.16

共收到 6 条回复
has_one :namespace, -> { where(type: nil) }, dependent: :destroy, foreign_key: :owner_id, class_name: "Namespace"

楼上的写法是4以后的吧,3.2.16好像还没有 v3.2.16/has_one 没有装3我用4的写法试了一遍没问题的,楼主要不再在console里检查一下

Namespace Load (0.3ms)  SELECT  "namespaces".* FROM "namespaces" WHERE "namespaces"."owner_id" = $1 AND "namespaces"."type" IS NULL LIMIT 1  [["owner_id", 2]]

#2楼 @z_ach 对,我没有留意到他注明的版本是 3.2.16

#2楼 @z_ach #3楼 @hungyuhei 我在rails c上面试了很奇怪 我重启机子后执行出现两条sql,如下:

Namespace Load (18.6ms)  SELECT `namespaces`.* FROM `namespaces` WHERE `namespaces`.`id` = ****** LIMIT 1
  Namespace Load (39.4ms)  SELECT `namespaces`.* FROM `namespaces` WHERE `namespaces`.`owner_id` = ****** AND `namespaces`.`type` IS NULL LIMIT 1

然后就找到正确的结果了,但是,我只是重启服务器,并没有重启机器时就只会出现第一条sql 然后我查了一下文档,似乎3.2的rails是支持conditions的,但是不知为何没有生效

#4楼 @zxzllyj 的确好奇怪。。第一条是按id查namespace的,直接user.namespace 应该只有第二条才对,只有第一条的话会不会是没执行到user.namespace就报错了,还是User被重新定义了namespace方法。重启服务器对结果有影响这个就比较奇怪了。。。

#5楼 @z_ach 刚刚重新在rails c里跑了一下,生成的sql是这个:

Namespace Load (8.2ms)  SELECT `namespaces`.* FROM `namespaces` WHERE `namespaces`.`owner_id` = 141089 LIMIT 1

限制条件还是没有加上去.... 我全文搜索了一下只在namespace下发现:

belongs_to :owner, class_name: "User"

然后再也没有看到别的了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册