Rails: 我需要做什么才能在命名空间内的两个模型之间创建多对多关系?
Rails: What do I need to do to create a many-to-many relationship between two models within a namespace?
一个命名空间中有两个模型,它们需要与has_and_belongs_to_many以多对多的关系关联。它们是这样创建的:
$ rails generate model namespace/model_a name:string
# app/models/namespace/model_a.rb
class Namespace::ModelA < ActiveRecord::Base
end
和
$ rails generate model namespace/model_b name:string
# app/models/namespace/model_b.rb
class Namespace::ModelB < ActiveRecord::Base
end
我需要做什么才能成功建立多对多关系?
我在让它工作时遇到了很多问题,但是通过大量解析 Rails 服务器错误消息和数据库客户端,我能够让它工作。这是我所做的:
使用 Rails 4,可以在单独的迁移中使用 has_and_belongs_to_many relationship in the models and with create_join_table 创建关联。当然,使用 rails 生成器达不到我们的目标。另请注意 create_join_table 的工作方式不同,甚至可能在 Rails.
的早期版本中不可用
步骤 1。为加入 table 而没有 命名空间生成迁移。我们稍后会调整。
$ rails g migration CreateModelAModelBJoinTable model_a model_b
# db/migrate/<somenumbers>_create_model_a_model_b_join_table.rb
class CreateModelAModelBJoinTable < ActiveRecord::Migration
def change
create_join_table :model_as, :model_bs do |t|
# t.index [:model_a_id, :model_b_id]
# t.index [:model_b_id, :model_a_id]
end
end
end
迁移需要一些改进。我们需要:
- 覆盖 table 名称以考虑命名空间
- 可选,select 一个索引。 提示:如果您的命名空间和模型名称很长,如果索引名称超出了数据库规定的字符限制,您可能必须覆盖索引名称。
这是最后的连接 table 迁移,注意在 table 名称中包含名称空间,但在索引中排除名称空间。简单地说,这将按照 rails has_and_belongs_to_many 期望的方式命名 table 及其索引。
# db/migrate/<somenumbers>_create_model_a_model_b_join_table.rb
class CreateModelAModelBJoinTable < ActiveRecord::Migration
def change
create_join_table :model_as, :model_bs, table_name: :namespace_model_as_namespace_model_bs do |t|
t.index [:model_a_id, :model_b_id], name: :index_namespace_model_ab # or whatever, according to your database naming scheme
# t.index [:model_b_id, :model_a_id]
end
end
end
步骤 2。使用 has_and_belongs_to_many 关联设置我们的模型。
除了关联之外,我们还需要覆盖class名称并加入table名称。
# app/models/namespace/model_a.rb
class Namespace::ModelA < ActiveRecord::Base
has_and_belongs_to_many :namespace_model_b, class_name: "Namespace:ModelB", join_table: "namespace_model_as_namespace_model_bs"
end
步骤 3。 运行 数据库迁移
rake db:migrate
遇到问题时的最后提示:
您可以随时 back out a migration,删除它,然后重新开始:
$ rake db:rollback STEP=1
$ rails d migration CreateModelAModelBJoinTable
希望对您有所帮助!
一个命名空间中有两个模型,它们需要与has_and_belongs_to_many以多对多的关系关联。它们是这样创建的:
$ rails generate model namespace/model_a name:string
# app/models/namespace/model_a.rb
class Namespace::ModelA < ActiveRecord::Base
end
和
$ rails generate model namespace/model_b name:string
# app/models/namespace/model_b.rb
class Namespace::ModelB < ActiveRecord::Base
end
我需要做什么才能成功建立多对多关系?
我在让它工作时遇到了很多问题,但是通过大量解析 Rails 服务器错误消息和数据库客户端,我能够让它工作。这是我所做的:
使用 Rails 4,可以在单独的迁移中使用 has_and_belongs_to_many relationship in the models and with create_join_table 创建关联。当然,使用 rails 生成器达不到我们的目标。另请注意 create_join_table 的工作方式不同,甚至可能在 Rails.
的早期版本中不可用步骤 1。为加入 table 而没有 命名空间生成迁移。我们稍后会调整。
$ rails g migration CreateModelAModelBJoinTable model_a model_b
# db/migrate/<somenumbers>_create_model_a_model_b_join_table.rb
class CreateModelAModelBJoinTable < ActiveRecord::Migration
def change
create_join_table :model_as, :model_bs do |t|
# t.index [:model_a_id, :model_b_id]
# t.index [:model_b_id, :model_a_id]
end
end
end
迁移需要一些改进。我们需要:
- 覆盖 table 名称以考虑命名空间
- 可选,select 一个索引。 提示:如果您的命名空间和模型名称很长,如果索引名称超出了数据库规定的字符限制,您可能必须覆盖索引名称。
这是最后的连接 table 迁移,注意在 table 名称中包含名称空间,但在索引中排除名称空间。简单地说,这将按照 rails has_and_belongs_to_many 期望的方式命名 table 及其索引。
# db/migrate/<somenumbers>_create_model_a_model_b_join_table.rb
class CreateModelAModelBJoinTable < ActiveRecord::Migration
def change
create_join_table :model_as, :model_bs, table_name: :namespace_model_as_namespace_model_bs do |t|
t.index [:model_a_id, :model_b_id], name: :index_namespace_model_ab # or whatever, according to your database naming scheme
# t.index [:model_b_id, :model_a_id]
end
end
end
步骤 2。使用 has_and_belongs_to_many 关联设置我们的模型。
除了关联之外,我们还需要覆盖class名称并加入table名称。
# app/models/namespace/model_a.rb
class Namespace::ModelA < ActiveRecord::Base
has_and_belongs_to_many :namespace_model_b, class_name: "Namespace:ModelB", join_table: "namespace_model_as_namespace_model_bs"
end
步骤 3。 运行 数据库迁移
rake db:migrate
遇到问题时的最后提示:
您可以随时 back out a migration,删除它,然后重新开始:
$ rake db:rollback STEP=1
$ rails d migration CreateModelAModelBJoinTable
希望对您有所帮助!