【问题标题】:Pushing to an Array in Ruby on Rails在 Ruby on Rails 中推送到数组
【发布时间】:2016-08-05 00:38:37
【问题描述】:

我正在尝试在我的模型中创建一个字符串数组,我可以在其中将新字符串 (ID) 推送到字符串数组中 - 但它没有推送正确的值。

这是模型的外观:

class CreateCompanies < ActiveRecord::Migration
  def change
  create_table :companies do |t|

  t.string :name
  t.string :email
  t.string :users, array: true, default: []
  t.timestamps null: false
  end
 end
end

这是我如何将新值添加到控制器中的数组:

c = Company.new
c.users << @user.id
c.save

确实会向数组中添加一个值,但它不是 ID,而只是一些随机值,如下所示:

users: "--- []\n\u{478A6}"

现在被困了几天 - 有人知道我错过了什么吗?

更新: 添加了我创建新公司的代码

 def create
@user = User.new(user_params)
if @user.save

  @user.id = SecureRandom.random_number(999999)
  session[:user_id] = @user.id

  c = Company.new
  c.id = SecureRandom.random_number(999999)
  c.name = @user.company_name
  c.email = "email goes here"
  c.users << @user.id
  c.save

  @user.company_id = c.id
  @user.save

  redirect_to '/dashboard'
else
  redirect_to '/'
end
end

【问题讨论】:

    标签: ruby-on-rails arrays ruby activerecord rails-activerecord


    【解决方案1】:

    如果您尝试建立一对多关系,您应该将company_id 字段添加到users 表,将belongs_to :company 添加到您的app/models/user.rb 并添加has_many :users给你的app/models/company.rb

    然后您就可以根据需要访问用户了。

    更新

    如果你想和用户一起创建公司,你可以这样。

    @user.company = Company.create name: 'Some name'
    

    甚至更好地避免重复。

    @user.company = Company.find_or_create_by name: 'Some name'
    

    【讨论】:

    • 我明白了!那么只需将 company_id 列添加到 Users 表就足够了吗?我以后如何才能获得属于某个公司的所有用户?
    • 您需要填写我描述的所有 3 个步骤。然后你就可以调用company.users,ActiveRecord 会做一个查询并返回一个 ActiveRecord::Relation 对象,它的作用就像一个用户数组。
    • 啊哈!目前,当创建新用户时,我正在 User 类中创建一个新公司。 (使用上面的代码)然后我将如何链接它们?
    • 谢谢!请查看我更新的问题中的代码 - 然后我可以设置公司的参数(例如 ID)吗?
    • 是的,你可以设置 company_id (而且你不需要调用c.users &lt;&lt; @user.id),虽然我真的不明白你为什么要使用 SecureRandom 来生成主键。您也可以使用if @user.valid? 而不是if @user.save 来避免两次保存同一个对象并可能弄乱数据库。
    【解决方案2】:

    我想知道你是否想在这里建立多对多关系,最好的方法是使用多对多表而不是将所有 id 作为数组字符串存储在数据库中;

    如果你确实想这样存储,最好的方法应该是形成一个字符串而不是直接放入数组。为此,array.join() 之类的东西对你很有帮助。

    如果你仍然坚持自己的方式,也许你应该尝试 array.push() 而不是

    【讨论】:

    • 当前关系是一对多的;一个用户只能有一个公司,但一个公司可以有多个用户。当我尝试使用 .push() 时,出现 No Method 错误。嗯,所以我可以例如。从模型中检索字符串对象,然后用最新的 ID 加入并更新它?
    • 如果是一对多,则不需要在 Company 表中放置列。执行此操作的正常方法是在 User 表中放置一个名为 company_id 的列。
    • 啊哈!我对此很陌生。在用户类中; belongs_to :company - 在 Company 类中; has_many:用户。我已经在 User 模型中有一个名为 t.string :company_name 的列,如何将它们链接在一起?
    • 它会自动为您创建关系,无需自己修改数据库。您可以通过guides.rubyonrails.org/active_record_basics.html 阅读更多相关信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2017-10-03
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多