話說,之前寫的一個東西,想說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.....以上