【问题标题】:Improving Ruby Sequel Model Code改进 Ruby Sequel 模型代码
【发布时间】:2018-05-01 00:42:19
【问题描述】:

我有以下模型,它检索一个名为 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 中有很多优雅的方式来做事,这可以用更优雅的方式编写。

【问题讨论】:

    标签: ruby model sequel


    【解决方案1】:

    我想到的是,基本上将所有内容打包到一个地图循环中:

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

    如果您在 Sequel 模型中设置关联,则可以在循环中使用 group_user.user.first.email。此外,在这种情况下,您可能希望预先加载关联以获得更好的性能:users = Model::GroupUser.eager(:user).where...

    【讨论】:

    • 其实是的,关联都设置好了!让我试试你对协会的建议
    • 甜蜜,group_user.user.first.email 工作!有没有办法不用map,而是作为一个单线?
    • 您可以在Model::GroupUser 上定义一个方法user_email。然后它只是 Model::GroupUser...map(&:user_email)。为了完全避开地图,我认为您必须手动加入表格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2016-02-12
    相关资源
    最近更新 更多