Ruby Rails拥有并且属于许多&;有很多:通过脚手架

Ruby Rails拥有并且属于许多&;有很多:通过脚手架,ruby,ruby-on-rails-3,scaffolding,Ruby,Ruby On Rails 3,Scaffolding,有没有一种方法可以为具有has_和_besive_to _many或has_many:through关系的Rails模型生成脚手架?如果没有,是否有一个发展的原因,为什么这个功能的一些基本形式没有被包括在内?Rails要求开发人员生成和编辑“自定义”的“联接表迁移”。对细节的必要关注是为了提醒Rails开发人员一些重要事实,还是这只是Rails如何成为“正在进行的工作”的一个示例 快速Stackoverflow搜索: "has_and_belongs_to_many" yields 821 qu

有没有一种方法可以为具有has_和_besive_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的功能集似乎非常广泛。我一直想知道为什么省略了连接表关联的脚手架

请将答案集中在上面的断言或“include语句”上,如“脚手架必须包含…”或“rails生成脚本需要…”


谢谢!

我喜欢你的问题,我一直想知道为什么Rails中没有包含这一点(而且我怀疑它没有作为Gem提供)。下面是一些原因,说明这可能是一个问题。我将用
程序集
零件
在典型示例中进行解释

  • 脚手架使用生成器创建文件。如果迁移到较新版本,有时可以通过执行以下步骤更新现有文件:

    • 将现有名称复制到新名称
    • 用新的覆盖现有的
    这意味着没有添加到文件或更改文件的概念。 编辑:这不是真的,有一些机制可以添加到文件,甚至更改文件

  • 如果您查看的是has-many的生成,例如,
    has-many:to
    (应该类似于
    has-many,并且属于多个
    ),您必须执行以下操作:

    • 添加创建联接表的迁移

      ==>应可通过以下操作进行脚手架搭建:
      rails g scaffold\u hmt组装件

    • 为该联接模型添加模型

      ==>应可通过前一个脚手架进行脚手架搭建

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

      assembly.rb:
      有_多个‘组件_零件’;有_多个:零件,:通过=>‘组件_零件’

      part.rb:
      有_多个‘组件_零件’;有_多个:组件,:通过=>‘组件_零件’

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

    • 如何处理视图是一个非常开放的问题。有一些例子说明了如何处理视图,但这并不是一个简单的问题,也没有一种技术在所有情况下都能很好地工作。我确实认为,不同的模式可以实现为脚手架模板(例如,使用复选框或多选列表或完成文本输入)。问题与
      中有许多视图的问题相同
  • 总而言之,一个脚手架可能值得一试(见下一段)。RailsGuides至少看起来是合理的。一个生成部分文件、相应命名并帮助控制台上脚手架的输出手动完成其余部分的解决方案可能值得一试


    我昨天试图提出一个局部解决方案,您可以看看。它的工作原理如下:

  • 将目录
    scaffold\u hmt
    (代表
    has\u many:through
    )的内容复制到rails应用程序目录
    lib/generators
  • 然后,您可以使用以下命令调用生成器:
    rails g scaffold\u hmt Assembly Part
  • 然后,它将生成:
    • 连接表的迁移
    • 联接表的模型
  • 它无法更改以下文件:

    • 型号
      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_列(2)rake db:migrate(3)rake joinHack MyModels MyJoinTable…通过第(3)步对您提到的文件进行更改?我想这仍然会留下一个悬而未决的问题。拥有一些非常基本的视图是否有价值?可能在视图或模型代码中包含一条注释性免责声明,即“这只是使用废话的一种方法。”。有关此主题的更多信息,请参阅此Railsguide。“我想第(1)步也可以/应该声明类似这样的内容,“要完成这三步流程,现在做这个和那个。”。请注意,步骤(3)代表一个不可逆转的步骤。祝您有个美好的一天。“在GitHub添加了示例实现,它实现了部分解决方案。我最近添加了一个示例应用程序,其中没有
    的关系,并且修复了生成器中的一些错误。它现在应该可以使用了。我希望它现在在Rails 5中可以工作:
    Rails生成模型公司名称:string industry:has_and_-behing_-to_-many
    ,这将把
    has_and_-behing_-to_-many::industry
    添加到
    公司
    模型中。