类别,子类别和律师之间的关联

时间:2016-09-01 21:57:41

标签: ruby-on-rails ruby ruby-on-rails-4 associations model-associations

我有很多律师,类别和子类别。

提示(所以如果我的关联合适,你可以有一个线索)

  1. 在“类别表”上,我不希望在“类别表”上看到引用“子类别”的列。
  2. 在子类别表上,我不希望在子类别表上看到引用类别的列。
  3. 并非所有类别都有子类别。也就是说,有些人没有图片中所示的子类别。
  4. 我有两个单独的表单来创建类别和子类别。
  5. 我将category_id和subcategory_id添加为我的律师表中的外键。这样我就可以在创建时选择律师形式,律师将在图像中尽快选择类别或子类别。
  6. 另请注意:可以在任何时间,任何一天为不具有子类别的类别创建子类别,以及在已经具有某些子类别的类别下的新子类别,并且律师将被置于其下
  7. 该图片是我目前所拥有的索引/主页的复制品,至少在上面的第6项以上任何时间生效之前,我希望使用循环来实现此视图。
  8. 图示了解我要做的事情:

      

    image description of my homepage

    以下是我在3个模特之间的关系

    class Lawyer < ActiveRecord::Base
      belongs_to :category
      belongs_to :subcategory
    end
    
    class Category < ActiveRecord::Base
      has_many :lawyers
    end
    
    class Subcategory < ActiveRecord::Base
      #belongs_to :category #Do I want "category_id" in Subcategories Table?
      has_many :lawyers
    end
    

    问题

      

    我对这3个型号的关联是否适合我提供的提示?这是   很混乱。

1 个答案:

答案 0 :(得分:5)

您不需要xml2:::doc_parse_raw型号/表格,特别是如果它们具有相同的列。您的Subcategory表格应该有一个categories列。当类别具有指向另一个类别记录的parent_id值时,该类别是子类别。具有parent_id NULL的类别是顶级类别。

示例

parent_id

注意:您应该创建迁移以将class Lawyer < ActiveRecord::Base belongs_to :category end class Category < ActiveRecord::Base has_many :lawyers # This is called a self referential relation. This is where records in a # table may point to other records in the same table. has_many :sub_categories, class_name: "Category", foreign_key: :parent_id # This is a scope to load the top level categories and eager-load their # lawyers, subcategories, and the subcategories' lawyers too. scope :top_level, -> { where(parent_id: nil).include :lawyers, sub_categories: :lawyers } end 列添加到类别表中。您可以删除子类别表。

现在创建一些类别(我假设那里有一个parent_id列):

name

示例目录:

cat = Category.create name: "Corporate and Commercial Law"
subcat = Category.new name: "Corporate Tax", parent_id: cat.id
subcat.lawyers << Lawyer.find_by_name("Sabina Mexis")
subcat.save

以上是一个简化的例子。希望有所帮助。

<强>更新

要增强表单以允许您创建子类别并指定其父类别,请使用填充了<% Category.top_level.each do |cat| %> <%= cat.name %> <% cat.sub_categories.each do |subcat| %> <%= subcat.name %> <%= subcat.lawyers.each do |laywer| %> <%= lawyer.name %> <% end %> <% end %> <% end %> 类别ID的选择菜单:

top_level

如果不熟悉,请查看options_from_collection_for_select的文档。它的作用是构建一个选择菜单,其中<%= form_for Category.new do |f| %> <%= f.text_field :name %> <%= f.select :parent_id, options_from_collection_for_select(Category.top_level, :id, :name) %> <%= f.submit %> <% end %> 类别为值,:id为菜单中的文本。请务必在强参数中添加:name,以便通过:parent_id进行质量分配。

params[:category]错误在我的示例代码中只是一个错字,现在已修复。