gpt4 book ai didi

ruby-on-rails-4 - 导轨 : What do I need to do to create a many-to-many relationship between two models within a namespace?

转载 作者:行者123 更新时间:2023-12-03 20:57:03 25 4
gpt4 key购买 nike

一个命名空间内有两个模型,它们需要以多对多的关系关联起来,即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 创建关联模型中的关系以及与create_join_table在单独的迁移中。当然,使用 rails 生成器达不到我们的目标。另请注意,create_join_table 的工作方式不同,甚至可能在以前的 Rails 版本中不可用。

第 1 步。为没有命名空间的连接表生成迁移。我们稍后会对其进行调整。

$ 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

迁移需要一些处理。我们需要:

  1. 覆盖表名以考虑命名空间
  2. (可选)选择一个索引。 提示:如果您的命名空间和模型名称很长,如果索引名称超过了数据库规定的字符限制,您可能必须覆盖索引名称。

这是最终的连接表迁移,注意在表名中包含命名空间,但在索引中排除命名空间。简单地说,这将按照 rails has_and_belongs_to_many 期望的方式命名表及其索引。

# 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 关联设置我们的模型。

除了关联之外,我们还需要覆盖类名和连接表名。

# 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

希望这对您有所帮助!

关于ruby-on-rails-4 - 导轨 : What do I need to do to create a many-to-many relationship between two models within a namespace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com