發新話題
打印

惡搞Rails的select & don't be eval(evil)

惡搞Rails的select & don't be eval(evil)

話說,之前寫的一個東西,想說permission太多很麻煩,就把該permission塞到Hash內......現在自食惡果了,不能Join.....Orz",用like去搜尋也很鳥之類的,最後還是改寫獨立成一個關聯,這時候就要說,不要太惡搞 ==w==",雖然Rails可以讓你很歡樂,但不要歡樂過頭就是了||||(don't be eval(evil))

而在實作Join的過程中...發現了一些有趣的地方,一般來說
複製內容到剪貼板
代碼:
A.find(id)
A.first(:conditions => ["id = ?" , id])
A.all(:conditions => ["id = ?" , id] , :limit => 1 , :order => "id").first
這樣的使用方式大概就已經滿足70%的使用需求,but開發到後期的多表join還是免不了,這邊提一下使用法則,以下,請對SQL語法有一定了解後才參閱

首先,實測結果:having沒有任何效果|||....請把它塞在:joins內
A.all的SQL對應為
複製內容到剪貼板
代碼:
A.all(:select => "Tselect" , :from => "Tfrom" , :joins => "Tjoin" , :order => "Torder" , :limit => "Tlimit" , :offset => "Toffset" , :conditions => "Tconditions")
#=>
SELECT "Tselect" FROM "Tfrom" "Tjoin" WHERE "Tconditions" ORDER BY "Torder" LIMIT "Toffset" , "Tlimit"
依照以上的規則,:join內可以塞HAVING和GROUP BY,當然用HAVING就不能用WHERE(conditions)了,而conditions的部分要考量清楚,串接要用括號(  )和AND或OR來串接,並且確認任何一段都不能讓使用者直接觸碰,否則很容易被隱碼攻擊||,所以以上,你可以搞一個很有趣的Join方式,從B開始join A,like
複製內容到剪貼板
代碼:
A.all(:select => "as.* , bs.name AS b_name" , :from => "bs" , :joins => "RIGHT JOIN as ON as.b_id = bs.id GROUP BY as.id HAVING as.user_id = #{@user.id}" , :order => "bs.id" , :limit => "10" , :offset => "50")
from是從bs(B)開始,join as(A)後再select A表格的全部,再把結果丟給AR的A
而上面的用法有把bs.name指定為b_name,所以就可以使用A.first.b_name來取得該值,一切合理又歡樂X"D.....以上
(Plurk) 人因夢想而偉大,如果沒有信仰,則將一無所有,持續往殉道的路邁進,獻祭著自己的靈魂,走著最極端的路;而那迷霧的後面,會是地獄,也是天堂
self.attributes #=> [惡搞之魂,貓化身,怪咖吸鐵石,邪道程式設計師,動漫宅,蘿莉控,惡趣味,Geek,H=F^3]
[82,117,98,121,32,79,110,32,82,97,105,108,115,32,105,115,32,77,121,32,76,105,102,101].map{|l|l.chr}.to_s

TOP

發新話題