Ruby on Rails -获取表的所有关联记录

yhuiod9q  于 2023-03-01  发布在  Ruby
关注(0)|答案(4)|浏览(113)

我有一个表叫Group

class Group < ApplicationRecord
  belongs_to :admin, class_name: "User", foreign_key: :admin_id
  has_many :memberships, dependent: :destroy
  has_many :users, through: :memberships
  has_many :tasks, dependent: :destroy
  has_many :tags, dependent: :destroy
  has_many :invitations, dependent: :destroy
end

我正在创建删除组时的一些测试。删除组后,我希望检查组是否已删除以及关联记录是否也已删除。

it "deletes the group" do
  expect(Group.find(group.id)).to_not be_present
end

it "deletes the group's dependent associations" do
  expect(Task.where(group: group).count).to eq 0
  expect(Tag.where(group: group).count).to eq 0
  expect(Invitation.where(group: group).count).to eq 0
  expect(Membership.where(group: group).count).to eq 0
end

我是这样写的,但感觉真的很重复。我想知道是否有另一种方法可以创建一个查询来获取数组中所有关联的记录,并检查数组是否为空。
我试着像这样连接where

Task.where(group: g).and(Tag.where(group: g)).and(Membership.where(group: g)).and(Invitation.where(group: g))

但它抛出以下错误:(Object doesn't support #inspect)
我读过关于joins的文章,但不能正确理解它,所以我不确定它是否是正确的方向。
任何帮助都将不胜感激。谢谢!
PD:我正在使用PostgreSQL作为数据库

vkc1a9a2

vkc1a9a21#

我不会测试这种行为,因为它只测试Ruby on Rails提供的实现,而Rails方法已经在框架内部进行了测试。
如果您真的想测试您的实现,那么我建议添加shoulda-matcher gem并测试关联是否按预期配置,如下所示:

RSpec.describe Group do
  describe 'associations' do
    it { is_expected.to have_many(:invitations).dependent(:destroy) }
    it { is_expected.to have_many(:tags).dependent(:destroy) }
    it { is_expected.to have_many(:tasks).dependent(:destroy) }
    it { is_expected.to have_many(:users).dependent(:destroy) }
  end
end
dfddblmv

dfddblmv2#

这不是表连接的任务,因为删除组时这些表没有要连接的内容。
可以通过在循环中调用expect来删除重复:

it "deletes the group's dependent associations" do
  [Task, Tag, Invitation, Membership].each do |klass|
    expect(klass.where(group: group).count).to eq 0
  end
end
jv2fixgn

jv2fixgn3#

为了测试行为,我认为最好是一个一个地测试,但是,一般来说,遵循良好的实践,而不是一个有几个期望的it,最好的事情是每个期望都有一个it。

RSpec.describe Group do
  context 'when to destroy' do
    let(:group) { create(:group) }

    before { group.destroy }

    it { expect(group).to be_destroyed }

    describe 'associations' do
      it { expect(group.invitations.exists?).to be false }
      it { expect(group.tags.exists?).to be false }
      it { expect(group.tasks.exists?).to be false }
      it { expect(group.users.exists?).to be false }
    end
  end
end
b1payxdu

b1payxdu4#

您可以使用以下命令获取记录类上的所有关联
组.反映所有关联
它会给予你一个联想数组。联想样本-

#<ActiveRecord::Reflection::HasManyReflection:0x00007f7752b24578    
  @active_record=Group (call 'Group.connection' to establish a connection),
  @klass=nil,                                                        
  @name=:users,                                                      
  @options={},                                             
  @plural_name="users",                                    
  @scope=nil>

还可以使用reflect_on_association方法获取特定关联的详细信息
组.反映关联(:用户)

相关问题