【问题标题】:Rails 4 - Creating Ancestry Tree with Associations - General Process?Rails 4 - 使用关联创建祖先树 - 一般过程?
【发布时间】:2015-02-27 22:10:23
【问题描述】:

~~> 仅供参考,我并不是在要求别人告诉我该怎么做,而是在我想通过学习经历时指导我。谢谢!

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

这就是我正在尝试的:

  1. 我有文章可以属于多个分类,分类可以有多个文章。所以我想建立一个多对多的关联。

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

  3. 最后,我想创建一个导航树来查看哪些文章属于哪个类别(我玩过 Ancestry gem)。树应遵循表格中指定的关联。可以有多个深度,例如:Science News(category) > Materials Engineering(category) > Graphene(article)

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

  • Rails 4.20
  • Ruby 2.1.5

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

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

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

经过大量的磨砺和磨练,我想出了一个解决方案。这是一步一步的。希望这将为遇到同样问题的其他人省去很多麻烦!

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 strong 参数,所以将其添加到文章控制器中。

我还没有走到这一步。等我弄明白了再更新!

【问题讨论】:

  • 不要编辑您的问题以包含解决方案,或者 1) 编辑答案以包含使其适合您的附加信息信息,或者 2) 将您自己的答案添加到问题.. . 两者都是有效的,您可以使用任何您认为更合适的... /跨度>
  • 吸地毯的人,我很困惑。为我自己的问题(选项 2)添加答案是评论还是添加到底部?我添加到底部
  • 嗨@nvrpicurnose。首先,当您有解决方案时,您需要将解决方案添加为您自己问题的答案。其次, has_many :category 和 has_many :article 没有任何意义,这让我认为您自己的解决方案从未经过测试,您只是在那里提出想法。第三,你以“我还没有走到这一步”结束。最后你根本没有提出任何解决方案。这就是我否决你的问题的原因,你应该学习如何使用 StackOverflow ;)

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


【解决方案1】:
  1. 如果每篇文章都属于一个类别,那么这不是简单的从类别到文章的 has_many 关联吗?

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

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

【讨论】:

  • 我想我不太清楚(问题已更新)。文章可以属于多个类别,并且类别深度可以不只是 2。例如,世界新闻 > 科学研究 > 材料工程
  • 好的,所以类别可以属于类别,所以祖先是一个不错的选择。然后为类别创建连接表,例如 category_memberships,每个表都有一个 article_id 和一个 category_id。文章是否可以属于跨多个树叶的类别或仅属于底部类别的父级?
  • 我不确定你所说的树叶到底是什么意思,但文章只能属于祖先中的最后一个子类别。他们将依靠祖先线来显示他们的根在哪里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多