Active Record架构问题

时间:2016-01-11 13:50:19

标签: ruby activerecord

尝试从使用sqlite3 gem的直接查询转移到Active Record。

以下是Active Record设置:

ActiveRecord::Schema.define do
  unless ActiveRecord::Base.connection.tables.include? 'admins'
    create_table :admins do |table|
      table.column :network_id,     :integer
      table.column :text,           :string
    end
  end

  unless ActiveRecord::Base.connection.tables.include? 'channels'
    create_table :channels do |table|
      table.column :network_id,     :integer
      table.column :name,           :string
      table.column :users,          :integer
      table.column :topic,          :string
    end
  end

  unless ActiveRecord::Base.connection.tables.include? 'messages'
    create_table :messages do |table|
      table.column :network_id,     :integer
      table.column :text,           :string
    end
  end

  unless ActiveRecord::Base.connection.tables.include? 'networks'
    create_table :networks do |table|
      table.column :name,           :string
    end
  end

  unless ActiveRecord::Base.connection.tables.include? 'servers'
    create_table :servers do |table|
      table.column :network_id,     :integer
      table.column :ip,             :string
      table.column :port,           :integer
    end
  end

  unless ActiveRecord::Base.connection.tables.include? 'users'
    create_table :users do |table|
      table.column :network_id,     :integer
      table.column :global,         :integer
      table.column :global_max,     :integer
      table.column :local,          :string
      table.column :local_max,      :integer
    end
  end
end

class Admin < ActiveRecord::Base
  belongs_to :network
end

class Channel < ActiveRecord::Base
  belongs_to :network
end

class Messages < ActiveRecord::Base
  belongs_to :network
end

class Network < ActiveRecord::Base
end

class Server < ActiveRecord::Base
  belongs_to :network
end

class User < ActiveRecord::Base
  belongs_to :network
end

由于我已将belongs_to添加到每个类,因此数据库查询未保存到数据库但未显示任何错误消息,这让我相信可能会误解如何使用这些belongs_to

基本上所有其他表都有一个network_id列需要映射到id表的networks列,所以如果有人试图插入admins } network_id为1但表1中的表不存在于networks表中,它应该失败。

belongs_to我应该在这里使用什么?

我还应该使用其他人,例如has_onehas_many还是?我习惯于编写纯SQL查询,因此阅读并尝试理解Active Record文档有点令人困惑!

1 个答案:

答案 0 :(得分:0)

对于您的网络型号:

class Network < ActiveRecord::Base
  has_many :admins, inverse_of: :network
  has_many :users, inverse_of: :network
  has_many :channels, inverse_of: :network
  has_many :messages, inverse_of: :network
  has_many :servers, inverse_of: :network
end
  1. 您还应该为每个其他模型添加反向关系。
  2. &#34;消息&#34;应该是单数。
  3. 你可能想要添加一个&#34;依赖&#34; &#34; has_many&#34;的选项关系,例如&#34;依赖:: destroy&#34;这样,如果删除了一个网络,则会在级联中删除其他表中的所有相关记录。
  4. 除此之外,您只需添加:

    validates :network, presence: true
    

    到其他模型,要求network_id映射到networks表中的实际ID。此外,您可能会利用外键(sqlite3可能不支持),您可能还想索引其他表中的network_id列。

    这里有很多基本工作要做。