Skip to content

Instantly share code, notes, and snippets.

@gouf
Created December 20, 2018 11:17
Show Gist options
  • Save gouf/36b56e1d7a39005bb550615bee70bd5f to your computer and use it in GitHub Desktop.
Save gouf/36b56e1d7a39005bb550615bee70bd5f to your computer and use it in GitHub Desktop.
メモ。 singularize, constantize + send で処理を共通化できるかもしれない
# 哀しみのドットつなぎテーブル名・カラム名が View か Controller か、どこからかやってくる
def search(table_and_column, search_values)
# table_and_column : 'member_types.name'
# search_values : %w[foo, bar]
result =
case table_and_column
# New code
when 'member_types.name' #, 'other_attr.name', 'some_attr.name'
model_name =
table_and_column.split('.') # => ['member_types', 'name']
.first # => 'member_types'
.singularize # => member_type
.split('_') # => ['member', 'type']
.map(&:camelize) # => ['Member', 'Type']
.join # => 'MemberType'
user_column_name =
table_and_column.split('.') # => ['member_types', 'name']
.first # => 'member_types'
.singularize # => 'member_type'
# In Rails:
ids =
model_name.constantize.where('name IN (?)', search_values)
.map(&:id)
# In Ruby:
# ids =
# Kernel.const_get(model_name).where('name IN (?)', search_values)
# .map(&:id)
User.send("find_by_#{user_column_name}", ids)
# Old codes
when 'other_attr.name'
# ...
OtherAttr.where('name IN (?)', search_values)
User.find_by_other_attr_id(ids)
when 'some_attr.name'
# ...
SomeAttr.where('name IN (?)', search_values)
User.find_by_some_attr_id(ids)
end
# and do something...
#
# attr_a = result.do_something
# ...
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment