2016年6月23日 星期四

ActiveRecord 後可用 select, sort_by, group_by

語句複雜很多table互相牽動時,sql的部分可以簡單化


Ex:

user = [
{ name: "C", is_admin: true, department: 20 },
{ name: "A", is_admin: true, department: 20 },
{ name: "B", is_admin: true, department: 25 },
{ name: "E", is_admin: true, department: 25 },
{ name: "D", is_admin: true, department: 25 },
{ name: "F", is_admin: false, department: 25 },
]

user = User.alluser.select! { |u| u[:is_admin] }
user_hash = user.group_by { |u| u[:department] }
user_hash.each { |k, v| v.sort_by! { |x| x[:name] } }

user_hash =
{20=>
[{:name=>"A", :is_admin=>true, :department=>20},
{:name=>"C", :is_admin=>true, :department=>20}],
25=>
[{:name=>"B", :is_admin=>true, :department=>25},
{:name=>"D", :is_admin=>true, :department=>25},
{:name=>"E", :is_admin=>true, :department=>25}]}



2016年4月22日 星期五

each_with_object 好用的地方

each_with_object 好用的地方

Ex:(多維展開)

{原本}
def org_users(users)
  temp = {}
  users.each do |user|
    temp[user.group] ||= {}
    temp[user.group][user.id] = user
  end
  temp
end

{改良}
users.each_with_object(Hash.new{ |h,k| h[k] = {} }) { |obj, hash| hash[obj.group][obj.id] = obj }



Ex:(類型計算)

x = ["tiger", "tiger", "cat", "tiger", "dog", "cat"]
x.each_with_object(Hash.new(0)) { |obj, counts| counts[obj] += 1 }


2016年4月14日 星期四

『*』的用法


「*」的用法 

把 array 展開成豆號分隔的 參數


Ex1:
numbers = [1, 2, 3]
numbers_with_zero_and_100 = [0, *numbers, 100] # => [0, 1, 2, 3, 100]

 Ex2:

def get_year_month
  year_month ||= params[:year_month] || Date.today.strftime("%Y-%m")
  year_month.split(/-|\/|_/).map { |i| i.to_i }
end
Date.new(*(get_year_month)) # =>  Fri, 01 Apr 2016