【问题标题】:Rails: Adding migration to add an array (default empty)Rails:添加迁移以添加数组(默认为空)
【发布时间】:2014-01-05 19:03:43
【问题描述】:

我正在尝试将名为 share 的列添加到我的一个资源中。 这个想法是用户可以上传文档并与其他(特定)用户共享,该数组包含用户想要共享的电子邮件。

我尝试使用代码添加迁移

class AddShareToDocuments < ActiveRecord::Migration
  def change
    add_column :documents, :share, :array, :default => []
  end
end

但是当我在命令提示符下打开 rails 控制台时,它说 share:nil 和 user.document.share.class 是 NilClass。

通过键入

在rails控制台沙箱中创建一个新数组
newarray = []

说 newarray.class 是数组。

谁能发现我做错了什么?

【问题讨论】:

  • 你在使用 Postgres 并且想要它的数组类型吗?
  • 我相信我正在使用 SQLite。我已经安装了 PostgreSQL,但我认为我没有将它用于这个应用程序。我想将一个名为“share”的变量添加到“document”,并且我希望“share”的类型是一个数组。
  • 如果这些解决方案中的任何一个对您有效,您应该接受最有效的答案。您提出的任何其他问题也是如此。从现在起 6 个月内遇到您的问题的任何其他人都可以更清楚地知道什么有效,什么无效。如果两者都不起作用,但你自己想通了,你应该发布你所做的并接受它。
  • 我还没有完全实现这两种解决方案。还有一个问题需要处理。同时,我试图弄清楚如何添加一个连接表(因为这个概念对我来说是新的)。但请放心,我会标记适合我的答案。谢谢提醒

标签: ruby-on-rails postgresql


【解决方案1】:

Rails 4 PostgreSQL 数组数据类型

在终端中

$ rails generate migration AddTagsToProduct tags:string

迁移文件:

class AddTagsToProduct < ActiveRecord::Migration
  def change
    add_column :products, :tags, :string, array: true, default: []
  end
end

https://coderwall.com/p/sud9ja/rails-4-the-postgresql-array-data-type

【讨论】:

    【解决方案2】:

    如果要支持所有数据库,则必须将数组序列化为字符串

    class Documents < ActiveRecord::Base
     serialize :share
    end
    
    class AddShareToDocuments < ActiveRecord::Migration
     def change
       add_column :documents, :share, :string, :default => []
     end 
    end
    

    如果是 Postgresql 和数组数据类型,我发现 https://coderwall.com/p/sud9ja

    【讨论】:

    • 谢谢。但我只是试图回滚我的最后一次迁移,我得到了“nil 类的未定义方法'to_sym'”错误。我一直在尝试谷歌解决这个问题,但无济于事。对此有什么帮助吗?所以我什至无法撤消上次迁移以序列化数组。
    • 可以删除数据库吗? rake db:drop db:create 然后按照我的描述更改您的迁移并运行 rake db:migrate
    • rake db:drop 不起作用。 “无法删除 db/development.sqlite3 : #<:eacces: permission denied db :>
    • @user2669464,要撤消迁移,有几种方法。你可以用 up 和 down 重写你的迁移。或者您可以进行新的迁移以删除该列。 rails g migration remove_share_from_documents - 然后是 rake:db:migrate - 如果您愿意,您可以使用 rails d migration remove_share_from_documents 删除迁移文件 - 您可以在删除所需内容后对原始文件执行相同操作。 rails d 迁移 add_share_to 文档
    【解决方案3】:

    数组通常不是存储在数据库中的类型。正如 michelemina 指出的那样,如果数组中的数据类型很简单(字符串、整数等),您可以将它们序列化为字符串并存储它们。对于您的电子邮件,您可以这样做。

    另一方面,如果您希望能够找到与文档共享的所有用户对象,则有更好的方法可以做到这一点。您将需要一个“连接表”。在您的情况下,连接表对象可能称为 Share,并具有以下属性:

    class Share
      belongs_to :user
      belongs_to :document
    end
    

    然后,在您的 Document 类中,

    has_many :shares
    has_many :users, :through => :shares
    

    就生成迁移而言,这可能很麻烦,但您可以创建一个新的迁移,将类型更改为“字符串”(编辑:正确代码):

    class AddShareToDocuments < ActiveRecord::Migration
      def up
        change_column :documents, :share, :string
      end
      def down
        change_column :documents, :share, :array, :default => []
      end
    end
    

    【讨论】:

    • 感谢这个想法。一旦我的迁移再次工作,我会试一试。我不知道 :through 关联。当您提到将类型更改为“字符串”时,您指的是 Share 类吗?在您的迁移代码中,我看不出它是如何将其转换为字符串类型的。
    • 抱歉,我懒得适应了。我要显示的内容已被编辑。希望这有效。
    猜你喜欢
    • 2011-10-29
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多