从ActiveRecord模型

时间:2017-05-17 00:36:33

标签: ruby-on-rails arrays ruby activerecord

我将导轨模型设置为:

class Master < ActiveRecord::Base
  belongs_to :user
  has_many :submasters
  serialize :subdocs, Array
end

它有一个序列化array submaster_docs,其中存储了已连接id的{​​{1}},subdocs的模型为:

Subdocs

现在我有一个rails方法,当用户点击删除按钮时删除class Subdocs < ActiveRecord::Base belongs_to :user end

在删除子代码条目时,我还要从subdoc中删除Subdocs的ID,这样即使在删除{{1}之后也不会尝试在它们之间创建关联}

Master的我的数据库条目如下所示:

Subdocs

Master的数据库条目:

<ActiveRecord::Relation [#<Master id: 3, user_id: 1, name: "Being Batman", description: "Every man who has lotted here over the centuries, ...", subdocs: ["5"]>]> 

例如,如果用户删除了子文件5,那么我想从所有subdoc的{​​{1}}数组中删除该值

我删除子文件的方法如下:

<ActiveRecord::Relation [#<Subdoc id: 5, user_id: 1, name: "subdoc1.pdf">]> 

但这会引发错误:subdocs

我该如何纠正?谢谢!

2 个答案:

答案 0 :(得分:2)

你不想在这里使用数组。特别是不是序列化数组:

  • 您必须扫描字符串才能在查询中使用该列。
  • 构建ActiveRecord关联以使用实际的外键列。关系数据库也是如此。
  • 你没有参考完整性。

首先创建迁移rails g migration add_master_to_subdocs

class AddMasterToSubdocs < ActiveRecord::Migration[5.0]
  def change
    add_reference :subdocs, :master, foreign_key: true
    remove_column :subdocs, :user_id
  end
end

我们也删除了user_id列,因为它不再需要:

class Master < ActiveRecord::Base
  belongs_to :user
  has_many :submasters
  has_many :subdocs
end

class Subdocs < ActiveRecord::Base
  belongs_to :master
  has_one :user, through: :master
end

答案 1 :(得分:0)

虽然我同意max并且您不应该使用此架构,假设您保持原样,您将需要从master中的数组中删除该项并保存master。

def destroy
  @masters = {}
  @subdoc = Subdoc.find(params[:id])
  @masters = current_user.user.masters
  @masters.each do |master| 
    if master.subdocs.index(params[:id])
      master.subdocs.delete(params[:id])
      master.save!
    end
  end  

  @subdoc.destroy
  return render :status => 200, :json => { :success => true }    
end