【问题标题】:After renaming a model and changing all references to the model, a reference remains to the previous name重命名模型并更改对模型的所有引用后,引用仍为以前的名称
【发布时间】:2012-10-04 19:20:07
【问题描述】:

在网上学习了一个教程后,我有了一个名为 Person 的模型。一段时间后,我们决定将其重命名为 User 更为明智。我浏览了代码库并执行了以下操作:

  1. 重命名了 Person to User、person to user、People to Users 和 people to users 的所有实例,注意不要破坏任何不相关的内容。
  2. 适当地重命名所有模型文件。

我有另一个模型叫做 session:

会话属于用户

用户有_many 个会话

在运行迁移之前 git grep -i person / people 并找到 | grep person / people 只是返回迁移,所以我确定我已正确重命名所有内容。

当我去创建一个随后创建会话的新用户时,我收到以下错误:

未知属性:user_id

再次运行 git grep 发现 session 中的外键还是 person_id

create_table "sessions", :force => true do |t|                                                                                                                             
    t.integer  "person_id
    t.string   "ip_address"                                                                                
    t.string   "path"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
end    

我该如何解决这个问题?

【问题讨论】:

  • 当您输入 User 时,您在控制台中看到了什么?
  • 你是否在更改后重新创建了你的数据库......删除你的数据库并重新运行迁移
  • @Emrah: User(id: integer, username: string, salt: string, encrypted_pa​​ssword: string, created_at: datetime, updated_at: datetime, email: string, profile_image_path: string, forename: string, surname : string, avatar_file_name: string, avatar_content_type: string, avatar_file_size: integer, avatar_updated_at: datetime, about: string)
  • @JonathanEvans 抱歉,我的意思是会话不是用户。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

只是在迁移中做

def change
   rename_column :sessions, :person_id, :user_id
end

【讨论】:

    【解决方案2】:

    如果您更改关联的名称,而不是基础列的名称,则必须在关联中明确说明:

    class Session 
      belongs_to :user, :foreign_key => "person_id", :inverse_of => :sessions
    end
    
    class User
      has_many :sessions, :foreing_key => "person_id", :inverse_of => :user
    end
    

    【讨论】:

      【解决方案3】:

      在会话表中,您必须将 person_id 更改为 user_id,

      for that you have to add new migration for adding user_id and remove person_id
      
      def change
        add_column :sessions, :user_id, :integer
        remove_column :sessions, :person_id, :integer
      end
      

      【讨论】:

      • 这不会破坏原来的belongs_to关联吗?
      • 接受了 Aayush 的回答,因为他的回答不涉及丢失数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多