【问题标题】:Active Record schema problemsActive Record 架构问题
【发布时间】:2016-01-11 13:50:19
【问题描述】:

我正在尝试从使用 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 列需要映射到networks 表的id 列,所以如果有人试图用network_id 插入到admins 表中1 但 1 在 networks 表中不存在它应该失败。

我应该在这里使用belongs_to 吗?

我还应该使用has_onehas_many 等其他名称吗?我习惯于编写简单的 SQL 查询,因此阅读和尝试理解 Active Record 文档有点令人困惑!

【问题讨论】:

    标签: ruby activerecord


    【解决方案1】:

    对于您的网络模型:

    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. “消息”应该是单数。
    3. 您可能希望为“has_many”关系添加一个“依赖”选项,例如“dependent: :destroy”,这样如果删除了一个网络,它在其他表中的所有依赖记录都会被级联删除。

    除此之外,您只需添加:

    validates :network, presence: true
    

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

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

    【讨论】:

    • 逆是什么意思?
    • 请参考api.rubyonrails.org并查找has_many。要对此进行扩展 - 您可能会很好地查看guides.rubyonrails.org 上的一些 RoR 指南,也许还有一本 RoR 书。这些指南可能会将您带到您需要的地方,特别是如果您只是使用 ActiveRecord。
    • 好的。对于has_many 等,我使用列名还是类名?即有或没有's'?
    • 阅读文档。 SO 并不是要替代文档。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多