2012-07-25 48 views
2

這裏是我真的很想做的事:Squeel評估字符串作爲一個的keyPath加入

Outage.joins{eval "unit.plant"} 

我將有字符串表示一個squeel的keyPath。我想把這個字符串發送到一個連接語句中。

但這裏是我得到的錯誤:

#<Class:0x639e328>: unknown class: Squeel::Nodes::Function 

我已經試過:

Outage.joins{"unit.plant"} 

但是,這並不工作...我缺少什麼?

我沒有看到任何這文檔GitHub的網頁:https://github.com/ernie/squeel/

感謝您的幫助!


更新: 我發現一個非常混亂的方式來退出這個功能:

("unit.plant".split ".").map{ |x| x.to_sym }.reverse.inject{ |acc, x| { x => acc } } 

這將輸出:

{:unit=>:plant} 

這可以被傳遞到連接squeel功能。我敢肯定,必須有比來構造嵌套符號:(

回答

2

如何

Outage.joins{Squeel::Nodes::KeyPath.new("unit.plant".split("."))} 

源有更好的方式:KeyPath Docs

+0

謝謝!完美的作品......我在文檔中查看了幾次,但我沒有連接,我可以將它傳遞到構造中或者像那樣。在某些領域,我仍然是一位Ruby n00b,但PHP會爲您做到這一點! – barancw 2012-07-25 05:07:15

+0

有一個缺點,它不能與外部/內部鏈接,如'Outage.joins {Squeel :: Nodes :: KeyPath.new(「unit.plant」.split(「。」))。inner} – raymondralibi 2012-08-07 17:16:07

1

替代的解決方案,它可以與外被鏈接/內:

strs = "unit.plant" 
Outage.joins{strs.split(".").inject((strs.present? ? self : nil), :__send__)} 

# chain with inner 
# Outage.joins{strs.split(".").inject((strs.present? ? self : nil), :__send__).inner}