Rails 4 - 用关联创建祖先树 - 一般过程?

时间:2015-02-27 22:10:23

标签: ruby-on-rails ruby many-to-many model-associations ancestry

~~>仅供参考我不是要求别人告诉我该做什么,而是指导我,因为我想要经历学习经历。谢谢! < ~~

Rails初学者在这里。我一直在尝试用新闻文章创建一个内容管理应用程序,事情进展顺利。到目前为止,我最大的障碍是将我的文章与他们的类别联系起来经过几个小时的谷歌搜索和学习,我想我需要一些大哥帮助。

这就是我的尝试:

  1. 我的文章可以属于多个类别,而类别可以有多篇文章。所以我想建立一个多对多的协会。

  2. 我还希望用户能够在通过表单创建新文章时指定文章属于哪个类别。我尝试在我的表单中使用collection_select,看起来很有希望。表格也应该能够从子类别中选择。

  3. 最后,我想创建一个导航树,以查看哪些文章属于哪个类别(我使用Ancestry gem玩过)。树应该遵循表单中指定的关联。可以有多个深度,例如:科学新闻(类别)>材料工程(类别)>石墨烯(物品)

  4. 我对如何完成所有这些的一般过程感到困惑。我已经尝试了各种方法,但似乎每次尝试都缺少一些小而重要的步骤。一位经验更丰富的Rails程序员能不能告诉我如何做到这一点?

    • Rails 4.20
    • Ruby 2.1.5

    -.--------------------------------------------- ----

    -.------ SOLUTION ---------------------

    -.--------------------------------------------- ----

    经过多次的苦难和磨练,我找到了解决方案。这是一步一步的。希望这会为遇到同样问题的其他人带来很多麻烦!

    1a上。您将首先要为多对多关联创建连接表。在cmd类型$ rails g model Categorizations。

    1b。在新生成的迁移文件中,将其更改为:

    class CreateCategorizations < ActiveRecord::Migration
      def up
        create_table :categorizations do |t|
          t.integer :article_id
          t.integer :category_id
          t.timestamps null: false
        end
        add_index :categorizations, ['article_id', 'category_id']
      end
      def down
        drop_table :categorizations
      end
    end
    

    1c上。在模型内部,将其更改为:

    文章模型:

    class Article < ActiveRecord::Base
        has_many :categorizations
        has_many :category, :through=> :categorizations
    end
    

    类别模型:

    class Category < ActiveRecord::Base
        has_many :categorizations
        has_many :article, :through=> :categorizations
    end
    

    分类模型:

    class Categorization < ActiveRecord::Base
        belongs_to :article
        belongs_to :category
    end
    

    1D。运行$ rake db:migrate

    2a上。现在,对于第2部分,我们将转到文章视图。在_form中,添加:

    <div class="form-group">
      <%= f.label(:category_id, "Reference *") %><br />
      <%= f.collection_select(:category_id, Category.order(:title), :id, :title)%>
    </div>
    

    2B。还包括在您的文章中:

    <tr>
        <th>Category</th>
        <td><%= link_to @article.category_id, category_path(:id=>@article.category_id)%></td>
    </tr>
    

    2c中。 @ article.category_id还不是文章的属性。我被困在这里很长一段时间。事实证明你必须单独添加该属性,因此在cmd上运行$ rails g migration AddIdToArticles。您的新迁移应如下所示:

    class AddIdToArticles < ActiveRecord::Migration
      def up
        add_column :articles, :category_id, :integer
      end
    
      def down
        remove_column :articles, :category_id
      end
    end
    

    2d上。运行$ rake db:migrate。接下来,我们必须允许:category_id通过rails强参数,所以将其添加到文章控制器中。

    我还没有到目前为止。一旦我搞清楚就会更新!

1 个答案:

答案 0 :(得分:0)

  1. 如果每篇文章属于单个类别,那么这不仅仅是一个从类别到文章的has_many关联吗?

  2. collection_select确实是一个很好的方式。

  3. 文章树的类别不仅仅是两个深度吗?我不认为需要祖先宝石。