Улучшение Ruby Sequel Model Code - PullRequest
0 голосов
/ 01 мая 2018

У меня есть следующая Модель, которая извлекает объект, известный как GroupUser, который в качестве названия предлагает Группу пользователей:

[# < Model::GroupUser @values = {: id => 24,
  : user_id => 8,
  : group_id => 3,
  : from_group_id => 3
} > , # < GroupUser @values = {: id => 27,
  : user_id => 9,
  : group_id => 3,
  : from_group_id => 3
} > , # < GroupUser @values = {: id => 36,
  : user_id => 7,
  : group_id => 3,
  : from_group_id => 3
} > ]

Я бы хотел превратить это GroupUser в соответствующие им адреса электронной почты (каждый User имеет свойство email)

Итак, я сделал следующее:

users = []
group_users = Model::GroupUser.where(:group_id => self[:address]).map(:user_id)
group_users.each do |user|
  users << Model::User.where(id: user).first.email
end
users

Это работает .. Но я чувствую, как много элегантных способов сделать что-то в Ruby, это можно было бы написать более элегантным способом.

1 Ответ

0 голосов
/ 01 мая 2018

Что приходит на ум, так это, по сути, упаковка всего в один цикл карты:

users = Model::GroupUser.where(:group_id => self[:address]).map do |group_user|
  Model::User.where(id: group_user[:user_id]).first.email
end

Если вы установили ассоциации в своих моделях сиквела, вы можете использовать group_user.user.first.email в цикле. Кроме того, в этом случае вы можете загрузить ассоциацию для повышения производительности: users = Model::GroupUser.eager(:user).where....

...