2014-10-27 64 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