Factory_girl中的数据库视图工厂

时间:2018-01-12 07:11:28

标签: ruby-on-rails ruby rspec factory-bot

我正在使用Rails 5.0.2和factory_girl_rails以及RSpec。

我有3个这样的联想模型:

/app/models/ticket.rb

class Ticket < ActiveRecord::Base
  has_many :ticket_snapshots, foreign_key: "duckduck_ticket_id"
end

/app/models/ticket_snapshot.rb

class TicketSnapshot < ActiveRecord::Base
  belongs_to :duckduck_ticket, class_name: "Ticket"
  has_many :matched_issues_summary,    class_name: "CookbookReportSummaryVw", foreign_key: "duckduck_ticket_snapshot_id"
end

/app/models/cookbook_report_summary_vw.rb

class CookbookReportSummaryVw < ActiveRecord::Base
  self.table_name = 'cookbook_report_summary_vw'
  belongs_to :duckduck_ticket_snapshot, class_name: "TicketSnapshot"
  belongs_to :duckduck_cookbook, class_name: "Cookbook"
end

正如你所看到的,cookbook_report_summary_vw实际上不是一个数据库表,但它更像是一个数据库视图(在应用程序中工作得很好,但似乎factory_girl不太喜欢它,我会告诉你错误后)

以下是我的factory_girl工厂的上述模型:

工厂/ tickets.rb

FactoryGirl.define do

  factory :ticket do
    title 'ticket'
    ticket_id '11111111'

    factory :ticket2 do
      title 'something bad happened'
      issue 'unknown'
      requester 'duckie_duck'
      after(:create) do |ticket|
            ticket.ticket_snapshots << create(:TicketSnapshot, duckduck_ticket: ticket)
      end
    end
  end
end

工厂/ ticketsnapshots.rb

FactoryGirl.define do

  factory :TicketSnapshot do

    association :duckduck_ticket

    factory :snapshot1 do
      status 'Pending'
      closure_code nil
      root_cause 'other'
      after(:create) do |ts|
        ts.matched_issues_summary << create(:CookbookReportSummaryVw, duckduck_ticket_snapshot: ts)
      end
    end

  end
end

工厂/ cookbook_report_summary_view.rb

FactoryGirl.define do
  factory :CookbookReportSummaryVw do

    association :duckduck_ticket_snapshot

    factory :summary_true do
      status 'true'

    end

  end
end

在我的工厂中,我已经定义了一个票证可以有多个ticket_snapshots,每个ticket_snapshot可以有许多cookbook_report_summary。

在RSPec中,如果我只尝试创建一个票证,我不会收到任何错误(好吧,如果我在factories / tickets.rb中删除了after(:create));但是在那里有那条线,我永远无法创建快照,我收到了这个错误:

ActiveRecord::StatementInvalid:
  PG::UndefinedTable: ERROR:  relation "cookbook_report_summary_vw" does not exist
  LINE 8:                WHERE a.attrelid = '"cookbook_report_summary_...
      SELECT a.attname, format_type(a.atttypid, a.atttypmod),
           pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
      (SELECT c.collname FROM pg_collation c, pg_type t

我不确定我是否没有正确定义我的关联,或者factory_girl无法与PostgreSQL视图交互。

我找到了factory_girl与数据库视图交互的解决方案,但我不太明白如何更改cookbook_report_summary_vw以遵守:https://github.com/thoughtbot/factory_bot/issues/449

经过一整天的工作后,我想我们会问你的专家意见。我应该说,如果我的用例中有更好的替代品,我不一定需要使用factory_girl。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

为了关闭而回答,正如Josh所说,我的测试环境迁移不是最新的,工厂女孩是无辜的!