레일즈에서 모델 관련 이슈
컨트롤러는 가볍게 모델은 두껍게
Last updated
컨트롤러는 가볍게 모델은 두껍게
Last updated
# users_controller.rb
def index # /api/users?status[]=online&status[]=playing&for=appearance
# 1. where로 특정 조건 선택. 반복문을 돌면서 쿼리로 들어온 조건을 탐색한다. 여기서 for은 제외. 그리고 params 는 strong parameter의 permit 으로 1차적으로 걸렀다고 가정한다.
users = User.all
params.each do |k, v|
next if k == 'for'
users = users.where(k => v)
end
# 2. select로 선택하기
users.select('id, name') if params[:for] == 'appearance'
end# user.rb
def self.where_and_select_by_query(params)
users = where_by_query(params)
if !params[:for].nil?
users = select_by_query(users, params[:for])
end
private
def where_by_query(params)
users = all
params.each do |k, v|
next if k == 'for'
users = users.where(k => v)
end
users
end
def select_by_query(users, condition)
if condition == 'appearance'
users.select('id, name')
else if condition == '...'
users.select('....')
end
end# users_controller.rb
def index
users = User.all
params.each do |k, v|
next if k == 'for'
users = users.where(k => v)
end
# 여기가 바뀐 부분이다!
users.left_outer_join(guild_membership: :guild).
select('users.id, users.name, users.status, guilds.anagram')
end