Rails从另一个表

时间:2017-03-22 16:00:40

标签: ruby-on-rails ruby activerecord

在用户模型中,我有一个存档!销毁用户时调用的方法。

用户有许多用户组,当用户被销毁时,应该将这些用户组存储在新的ArchivedUserGroup表中。

ArchivedUser已成功创建,但我无法从UserGroup表中获取用户group_id

      ArchivedUserGroup.create(
        user_id: self.id, 
        group_id: UserGroup.where(:user_id => self.id).pluck(:group_id).to_set
      )

感谢任何帮助过我的人,我只是开始使用Rails并使用相当复杂的代码库。

1 个答案:

答案 0 :(得分:1)

由于每个用户都有许多UserGroup记录,并且ArchivedUserGroup与常规UserGroup(user_id,group_id)具有相同的属性,我认为您应该为每个用户UserGroup记录创建一个ArchivedUserGroup,而不仅仅是一个。您正在尝试将集合(如数组)传递给group_id列。虽然您还没有显示您的架构,但是group_id可能是一个整数,因为它是一个外键,所以数据类型不匹配。相反,你可以这样做:

UserGroup.where(user_id: self.id).each do |user_group|
  ArchivedUserGroup.create(
    user_id: self.id,
    group_id: user_group.group_id
  )
end

如果某些用户拥有大量用户组,这可能会很慢,因为在迭代中发生了数据库调用(创建)。这被称为N + 1查询,在这种情况下,它的方法是使用批量插入,通过原始SQL或类似bulk_insert gem。