2014-01-21 57 views
0

我在使用Rails的LEFT OUTER JOIN时遇到问题。我想我已经关闭了Ruby代码,但是当我将它输入到rails console时,我得到了一个结果,当我复制生成的MySQL时,我得到了另一个结果。 rails console中缺少整列(值)。为什么SQL是完全相同的,但我得到不同的结果?理想情况下,我希望结果包含值列。一如既往的帮助将不胜感激。Rails控制台不同的MySQL结果

Rails的控制台响应

2.0.0-p353 :023 > SecurityItem.joins("LEFT OUTER JOIN security_role_permissions ON security_role_permissions.security_item_id = security_items.id AND security_role_permissions.role_id ='1'").select("security_items.name, security_role_permissions.value") 

SecurityItem Load (0.7ms) SELECT security_items.name, security_role_permissions.value FROM `security_items` LEFT OUTER JOIN security_role_permissions ON security_role_permissions.security_item_id = security_items.id AND security_role_permissions.role_id ='1 

=> #<ActiveRecord::Relation 
[#<SecurityItem id: nil, key: "ChangePassword", name: "Change Password">, 
#<SecurityItem id: nil, key: "AddUsers", name: "Add Users">, 
#<SecurityItem id: nil, key: "UpdateUsers", name: "Update Users">, 
#<SecurityItem id: nil, key: "DeleteUsers", name: "Delete Users">]> 

MySQL的回应只有

mysql> SELECT security_items.name, security_role_permissions.value FROM `security_items` LEFT OUTER JOIN security_role_permissions ON security_role_permissions.security_item_id = security_items.id AND security_role_permissions.role_id ='1'; 

+-----------------+-------+ 
| name   | value | 
+-----------------+-------+ 
| Change Password |  1 | 
| Add Users  | NULL | 
| Update Users | NULL | 
| Delete Users | NULL | 
+-----------------+-------+ 
+0

为什么你甚至不打扰使用ActiveRecord? – coreyward

+0

如何使用Rails直接进行查询?我认为首选的方法是使用ActiveRecord? – evanvee

+0

你应该从[docs]开始(http://guides.rubyonrails.org/active_record_querying.html)。你很少需要为这样的基本东西编写SQL查询。因为你的命名都是fubar,所以很难说你的模型是什么样子的,或者你的意图是什么,但是像'SecureItem.where(role:Role.find(1))。all'会更多ActiveRecord-风格的做法。 – coreyward

回答

1

从SecurityItem类的属性出现在返回结果。但是,您可以通过'attributes'方法访问连接表中的属性。

security_items = SecurityItem.joins("LEFT OUTER JOIN security_role_permissions 
ON security_role_permissions.key = security_items.key AND 
security_role_permissions.role_id ='1'").select("security_items.name, 
security_items.key, security_role_permissions.permission") 

security_items.each { |security_item| puts security_item.attributes['permission'] } 
+0

我试过了,它没有工作。我得到以下'NameError:未定义的局部变量或方法'属性'为主:对象' – evanvee

+0

对不起,意外地留下了一部分。尝试编辑。 – johnsorrentino

+0

有没有办法让它在相同的回应,如一个查询,并不需要每个或不可能?这工作,但只是想看看是否没有更好的方法。 – evanvee

相关问题