我尝试从使用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_one
,has_many
还是?我习惯于编写纯SQL查询,因此阅读并尝试理解Active Record文档有点令人困惑!
答案 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
除此之外,您只需添加:
validates :network, presence: true
到其他模型,要求network_id映射到networks表中的实际ID。此外,您可能会利用外键(sqlite3可能不支持),您可能还想索引其他表中的network_id列。
这里有很多基本工作要做。