2014-10-27 68 views
0

我有一个非常复杂的SQL查询,我想转换为RoR的ORM。复杂的SQL查询到RoR ORM

SELECT c.* FROM (SELECT companies.* FROM companies WHERE city = "?" AND country = "?") AS c INNER JOIN tagsForCompany AS tc ON c.id = tc.Company INNER JOIN tags AS t ON t.id = tc.TID WHERE t.Name REGEXP '?' 

我所定义的模型是这样的:

companies.rb

class Company < ActiveRecord::Base 
    # ... Some code that doesn't matter 
    has_and_belongs_to_many :tags 
    # ... Some other code 
end 

和tags.rb

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :company 
end 

我需要在公司控制器搜索功能针对上述查询的公司。

回答

0

选项:

首先find_by_sql()

说明:允许你把你想要的任何查询。

http://apidock.com/rails/ActiveRecord/Base/find_by_sql/class

.where().joins()方法的结合。

但是要小心,如果您在.where()之后调用.joins()并返回nil,那么您将得到未定义方法的错误。这里的解决方案将首先测试.where()是否返回任何内容,然后您可以与另一个表连接。

可能使用的方式联接:

joins(:tags)创建一个内部联接

joins('Left join foo...')使您可以使用左outter加入

joins(tagsForCompanies: :tags)如果你有N至N关联嵌套的联接。

见API:

http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-where

http://guides.rubyonrails.org/active_record_querying.html#joining-tables

+0

是的,我能做到这一点,但我宁愿使用回报率的ORM ... – user3807877 2014-10-27 15:48:21

+0

事情是这样的代码? ([:city =“?”AND country =“?”,“NY”,“US”])。joins(:tags).where(t.Name REGEXP'?','/ regexp /' ) 看看其中()方法,并加入()方法: http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-where HTTP://api.rubyonrails .org/classes/ActiveRecord/QueryMethods.html#method-i-joins – 2014-10-27 15:58:37

+1

此外,你应该使用rails规范中的pluralize:has_and_belongs_to_many:公司 – 2014-10-27 16:04:26