【问题标题】:can't use some column methods in migration method change在迁移方法更改中不能使用某些列方法
【发布时间】:2016-02-03 12:48:59
【问题描述】:

我的 Db 正在改变结构,我在 change 方法中使用列方法时遇到问题

这是我的模型:

  Project(id: integer, 
          created_at: datetime, 
          updated_at: datetime, 
          creator_id: integer, 
          brand_id: integer,
          order_id: integer,
          real: boolean, 
          state: string, 
          finished_work_url: string)

  Order(id: integer, 
    created_at: datetime, 
    updated_at: datetime,
    brief_id: integer, 
    state: string, 
    delivered_at: datetime)

  LegalOption(id: integer, 
              project_id: integer, 
              custom_document_file_name: string, 
              custom_document_content_type: string, 
              custom_document_file_size: integer, 
              custom_document_updated_at: datetime)

  Proposal(id: integer, 
    created_at: datetime, 
    updated_at: datetime,
    brief_id: integer, 
    creator_id: integer, 
    description: text, 
    price: float, 
    deposit_percentage: integer)

我将project_id 列更改为proposal_id,这是另一个模型。所以我想为每个LegalOption 检索我的project_id 并放置正确的proposal_id
我尝试使用订单和项目之间的关联,但由于 Rails 约定,我遇到了错误The method .order() must contain arguments
现在因为我的 2 个模型是同时创建的,所以我想使用方法 created_at 来获取与我的项目相对应的订单。但我有错误:

  undefined method `created_at' for #<Project:...

我不明白为什么我不能使用这种方法。
这是我的迁移代码:

  class ChangeDbStructureLegal < ActiveRecord::Migration

    def change
      old_db_structure_hash = {}
      LegalOption.all.each do |legal_option|
        old_db_structure_hash[:project_id] = legal_option.project_id
        project = Project.where(id: old_db_structure_hash[:project_id])
        Order.all.each do |o|
          if o.created_at == project.created_at
            proposal = Proposal.where(brief_id: o.brief.id, creator_id: project.creator.id)
            old_db_structure_hash[:proposal_id] = proposal.id
          end
        end

        rename_column :legal_options, :project_id, :proposal_id
        legal_option.proposal_id = old_db_structure_hash[:proposal_id]
      end
    end
  end

【问题讨论】:

    标签: ruby-on-rails migration database-migration


    【解决方案1】:

    您使用的是where,它将始终返回一个关联,而不是单个对象,因此您要么需要添加.first,要么使用find_by。

    保持原样,您尝试在列表而不是对象上调用 .project_id,这将不起作用

    class ChangeDbStructureLegal < ActiveRecord::Migration
    
        def change
          old_db_structure_hash = {}
          LegalOption.all.each do |legal_option|
            old_db_structure_hash[:project_id] = legal_option.project_id
            project = Project.find_by(id: old_db_structure_hash[:project_id])
            Order.all.each do |o|
              if o.created_at == project.created_at
                proposal = Proposal.find_by(brief_id: o.brief.id, creator_id: project.creator.id)
                old_db_structure_hash[:proposal_id] = proposal.id
              end
            end
    
            rename_column :legal_options, :project_id, :proposal_id
            legal_option.proposal_id = old_db_structure_hash[:proposal_id]
          end
        end
      end
    

    【讨论】:

    • 感谢您的回答,我不知道为什么我没有想到这一点。但是现在这会产生错误:PG::UndefinedTable: ERROR: missing FROM-clause entry for table "id"
    • 当我获得更好的声誉时我会投票,我是新来的^^
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2014-07-01
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多