Pluck - :
這個指令能讓搜尋結果的特定欄位獨立抽取出來放到 Array 裡,在很多情形下都很方便。Ex:
User.all.pluck :name # => ["Kevin", "Laura", "Yiya", "Diya"]
Subquery:
以第一個query的結果作為條件做搜尋,Ex:Order.where( :product_id => Product.where("price<1000") )
(Reference: http://ruby-china.org/topics/10771)
Update with condition:
Ex:Model.where("state == 'decline'").update_all(:state => 'deny')
has_many relation with condition:
當兩個 model 彼此為一對多關係時,我們可以利用 condition 讓這個關係有所區分,我拿以下的情形為例:user 有很多訂單 (orders) ,有些是取消的、有些是處理中的、有些是已經結帳的。在這個情形下,用 user.orders 撈所有的訂單後再進行判斷顯然沒有效率、用 Order.where("{條件}") 的方法也就失去了 relation 的方便與直觀。這時我們可以做加上這幾個 relation:has_many :cancled_orders, :class_name=>"Order", :conditions=>proc{ "status = 'Cancled'" } has_many :handling_orders, :class_name=>"Order", :conditions=>proc{ "status = 'Handling'" } has_many :paid_orders, :class_name=>"Order", :conditions=>proc{ "status = 'Paid'" }
這樣就可以透過如
current_user.cancled_orders
的方式取到「取消的訂單」了,相當直觀。OR condition using Arel
Ex:t = Post.arel_table results = Post.where( t[:author].eq("Someone"). or(t[:title].matches("%something%")) )