1

~~> FYI Я не прошу кого-то сказать мне, что делать, а скорее направить меня, как я хочу пройти через опыт обучения. Спасибо! < ~~Rails 4 - Создание дерева предков с ассоциациями - общий процесс?

Rails начинающий здесь. Я пытался создать приложение для управления контентом в новостных статьях, и все идет хорошо. Мое самое большое препятствие пока связывает мои статьи с их категориями. После многих часов поиска и обучения, я думаю, мне нужна помощь большого брата.

Это то, что я пытаюсь:

  1. У меня есть статьи, которые могут принадлежать к нескольким категориям, и категории могут иметь несколько статей. Поэтому я хочу создать ассоциацию «многие-ко-многим».

  2. Я также хочу, чтобы пользователи могли указать, к какой категории относится изделие, когда они создают новую статью через форму. Я пробовал использовать collection_select в своей форме, и это кажется многообещающим. Форма также должна иметь возможность выбирать из подкатегорий.

  3. Наконец, я хочу создать навигационное дерево, чтобы узнать, какие статьи принадлежат какой категории (я играл с жемчужиной Ancestry). Дерево должно следовать ассоциациям, указанным в форме. Там может быть несколько глубин, например: Science News (категория)> Материаловедение (категория)> Графен (статья)

Я запутался в общем процессе, как осуществить все это. Я пробовал различные подходы, но кажется, что в каждой попытке отсутствовал какой-то незначительный, но жизненно важный шаг. Может ли более опытный программист Rails просветить меня о том, как это сделать?

  • Rails 4,20
  • рубин 2.1.5

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

-.------ РЕШЕНИЕ --------------- ------

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

После многих кашей и усмешки d, я выяснил решение. Вот шаг за шагом. Надеюсь, это сэкономит много головной боли для кого-то еще с той же проблемой!

1a. Сначала вы должны создать таблицу соединений для ассоциаций «многие-ко-многим». В cmd тип $ rails g model Категоризация.

1b.Inside ваш Вновь созданный файл миграции, изменить его на:

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. Run $ rake db: migrate

2a. Теперь для части 2 мы перейдем к просмотрам статей. Внутри _формы добавить:

<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 через рельсы сильные параметры, поэтому добавьте это в контроллер статей.

Я еще не получил это еще. Обновится, как только я это выясню!

+0

Не редактируйте свой вопрос, чтобы включить решение, либо 1) отредактируйте ответ, чтобы включить дополнительную информацию, которая заставила его работать на вас, либо 2) добавьте свой собственный ответ на вопрос ... Оба являются действительными, и вы можете использовать то, что, по вашему мнению, более уместно ... Я отменил редактирование (но вы все еще можете увидеть его, если просмотрите историю изменений, если вы нажмете «Отредактировано X минут назад»). – Carpetsmoker

+0

Carpetsmoker, я смущен. Добавив ответ на мой собственный вопрос (вариант 2), это будет комментарий или добавление в нижней части? Я добавил к нижней – nvrpicurnose

ответ

0
  1. Если каждая статья принадлежит один категорию, то это не то, что просто has_many ассоциации из категории к статье?

  2. collection_select действительно кажется хорошим способом.

  3. Разве категория к дереву статьи не была бы глубиной в два? Я не вижу необходимости в родословной.

+0

Я думаю, я не был слишком ясным (вопрос обновлен). Статьи могут принадлежать нескольким категориям, а глубина категории может быть больше, чем просто 2. Например, World News> Science Research> Materials Engineering – nvrpicurnose

+0

Хорошо, поэтому категории могут принадлежать к категориям, поэтому предки - хороший выбор. Затем создайте таблицы объединений для категорий так, как category_memberships, у каждого из которых есть article_id и category_id. Могут ли статьи относиться к категориям через несколько деревьев или только к родителям нижней категории? – spitfire109

+0

Я не уверен, что вы подразумеваете под деревьями, но статьи могут принадлежать только к последней подкатегории в родословной. Они будут полагаться на линию родословной, чтобы показать, где их корень – nvrpicurnose

 Смежные вопросы

  • Нет связанных вопросов^_^