Rails4-创建具有关联的祖先树-一般过程



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

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

这就是我正在尝试的:

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

  2. 我还希望用户在通过表单创建新文章时能够指定文章属于哪个类别。我已经尝试在表单中使用collection_select,这似乎很有希望。表单也应该能够从子类别中进行选择。

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

我对如何完成这一切的一般过程感到困惑。我尝试了各种方法,但似乎每一次尝试都错过了一些微小但至关重要的步骤。一位更有经验的Rails程序员能告诉我如何做到这一点吗?

  • 轨道4.20
  • Ruby 2.1.5

-。---------------------------------------------------------

-------解决方案--------------------

-。---------------------------------------------------------

经过一番苦心经营,我想出了一个解决办法。这是一个循序渐进的步骤。希望这能为其他有同样问题的人省去很多头痛!

1a。您需要首先为多对多关联创建一个联接表。在cmd中键入$rails g model Categories。

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还不是article的属性。我被困在这里很长时间了。原来你必须单独添加该属性,所以在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强参数,因此将其添加到articles控制器中。

我还没有走到这一步。一旦我弄清楚就会更新!

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

  2. collection_select确实是一个不错的选择。

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

最新更新