【问题标题】:Rails has_and_belongs_to_many & has_many :through scaffoldingRails has_and_belongs_to_many & has_many:通过脚手架
【发布时间】:2011-10-10 05:25:06
【问题描述】:

有没有办法为具有 has_and_belongs_to_many 或 has_many :through 关系的 Rails 模型生成脚手架?如果没有,是否有一些基本形式的功能没有被包括在内的发展原因? Rails 要求开发人员生成和编辑“自定义”“连接表迁移”。对细节的必要关注是提醒 Rails 开发人员一些重要事实的一种方式,还是这仅仅是 Rails 是“正在进行的工作”的一个例子?

快速 Stackoverflow 搜索:

"has_and_belongs_to_many" yields 821 questions  
"has_many :through" yields 933 questions  

...其中许多都以“我如何...”开头,因此该主题似乎并非微不足道,并且与 SO 用户相关。我想我想知道为什么它没有受到关注。事情是否比看起来更复杂? Rails 的功能集似乎非常广泛。我一直想知道为什么省略了与连接表关联的脚手架。

请将您的答案集中在上述断言或“包含语句,例如,“脚手架必须包含...”或“rails generate script 需要...”

谢谢!

【问题讨论】:

  • 我希望它现在可以在 Rails 5 中工作:rails generate model company name:string industry:has_and_belongs_to_many 这会将 has_and_belongs_to_many: :industry 添加到 company 模型中。

标签: ruby ruby-on-rails-3 scaffolding


【解决方案1】:

我喜欢你的问题,我自己也想知道为什么它不包含在 Rails 中(而且我怀疑它不能作为 Gem 使用)。以下是这可能成为问题的一些原因。我会用assembliesparts的典型例子来解释。

  1. 脚手架通过使用生成器创建文件来工作。如果您迁移到较新的版本,有时可以选择通过执行以下步骤来更新现有文件:

    • 将现有名称复制到新名称。
    • 用新的覆盖现有的。

    这意味着没有添加到文件或更改文件的概念。 编辑:这不是真的,有一些机制可以添加到文件甚至更改文件。

  2. 如果你看一下 e.g. has_many :through(应该类似于has_and_belongs_to_many)你必须做以下事情:

    • 添加一个创建连接表的迁移。

      ==> 应该可以通过以下方式搭建脚手架:rails g scaffold_hmt Assembly Part

    • 添加该连接模型的模型。

      ==> 应该可以用之前的脚手架来搭建脚手架。

    • 更改现有模型以包含以下行:

      assembly.rb: has_many 'assemblies_parts'; has_many :parts, :through => 'assemblies_parts'

      part.rb:has_many 'assemblies_parts'; has_many :assemblies, :through => 'assemblies_parts'

      ==> 所以没有脚手架可能

    • 如何处理视图是完全开放的。 RailsCast 有示例如何做到这一点,但这一点也不简单,而且没有一种单一的技术可以在所有情况下都很好地工作。我确实认为可以将不同的模式实现为脚手架模板(例如,使用复选框或多选列表或完成的文本输入)。但是,问题与 has_many 视图中的相同。

总而言之,脚手架值得一试(见下一段)。至少Creating and Customizing Rails Generators & Templates 的 RailsGuides 似乎是合理的。值得一试的解决方案是生成部分文件、相应地命名它们并帮助控制台上的脚手架输出以手动完成其余部分。


我昨天尝试了一个部分解决方案,您可以在GitHub 看看它。它是这样工作的:

  1. 将目录scaffold_hmt(代表has_many :through)的内容复制到您的rails应用程序目录lib/generators
  2. 您可以通过以下方式调用生成器:rails g scaffold_hmt Assembly Part
  3. 然后它将生成:
    • 连接表的迁移
    • 连接表的模型
  4. 修改文件失败:

    • 型号assembly.rb
    • 型号part.rb

    原因是找到正确的位置并非易事。作为一种解决方法,它会打印出应该插入到文件中的内容。

    c:\apps\ruby\rails3\minds>rails generate scaffold_hmt Assembly Part
          create  db/migrate/20111011135944_create_assemblies_parts.rb
          create  app/models/assemblies_part.rb
    Try to insert into file: app/models/assembly.rb the following statements:
    
    has_many :assemblies_parts
    has_many :parts, :through => :assemblies_parts
          insert  app/models/assembly.rb
    Try to insert into file: app/models/part.rb the following statements:
    
    has_many :assemblies_parts
    has_many :assemblies, :through => :assemblies_parts
          insert  app/models/part.rb
    

试一试,看看是否对你有帮助。

【讨论】:

  • 感谢您的回复。所以一个问题是支持现有文件的更改。这会使不可逆的三步脚手架生成过程成为可能吗? (1) rails 生成 MyModels 和 my_columns (2) rake db:migrate (3) rake joinHack MyModels MyJoinTable ... 与步骤 (3) 进行您提到的文件更改?我想这仍然给 Views 留下了一个悬而未决的问题。
  • 拥有一些非常基本的视图是否有价值?可能在视图或模型代码中包含注释的免责声明“这只是使用废话的一种方法,废话。有关该主题的更多信息,请参阅此 Railsguide。”
  • 我猜步骤 (1) 可以/应该也声明类似,“要完成这三个步骤的过程,现在做这个和那个。请注意,步骤 (3) 代表一个不可逆转的步骤。有美好的一天。”
  • 在 GitHub 上添加了示例实现,实现了部分解决方案。
  • 我最近添加了一个示例应用程序,其中没有 has_many :through 关系,并修复了生成器中的一些错误。现在应该可以使用了。
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
相关资源
最近更新 更多