~~> FYI Я не прошу кого-то сказать мне, что делать, а скорее направить меня, как я хочу пройти через опыт обучения. Спасибо! < ~~Rails 4 - Создание дерева предков с ассоциациями - общий процесс?
Rails начинающий здесь. Я пытался создать приложение для управления контентом в новостных статьях, и все идет хорошо. Мое самое большое препятствие пока связывает мои статьи с их категориями. После многих часов поиска и обучения, я думаю, мне нужна помощь большого брата.
Это то, что я пытаюсь:
У меня есть статьи, которые могут принадлежать к нескольким категориям, и категории могут иметь несколько статей. Поэтому я хочу создать ассоциацию «многие-ко-многим».
Я также хочу, чтобы пользователи могли указать, к какой категории относится изделие, когда они создают новую статью через форму. Я пробовал использовать collection_select в своей форме, и это кажется многообещающим. Форма также должна иметь возможность выбирать из подкатегорий.
Наконец, я хочу создать навигационное дерево, чтобы узнать, какие статьи принадлежат какой категории (я играл с жемчужиной 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 через рельсы сильные параметры, поэтому добавьте это в контроллер статей.
Я еще не получил это еще. Обновится, как только я это выясню!
Не редактируйте свой вопрос, чтобы включить решение, либо 1) отредактируйте ответ, чтобы включить дополнительную информацию, которая заставила его работать на вас, либо 2) добавьте свой собственный ответ на вопрос ... Оба являются действительными, и вы можете использовать то, что, по вашему мнению, более уместно ... Я отменил редактирование (но вы все еще можете увидеть его, если просмотрите историю изменений, если вы нажмете «Отредактировано X минут назад»). – Carpetsmoker
Carpetsmoker, я смущен. Добавив ответ на мой собственный вопрос (вариант 2), это будет комментарий или добавление в нижней части? Я добавил к нижней – nvrpicurnose