Я не могу получить has_many: через Ассоциацию работать. И мне нужно установить что-то лишнее в методе create из post_controller, чтобы сохранить также post_category? (Под кодом ошибки и мои попытки)has_many: через Ассоциацию, NoMethodError (неопределенный метод `each 'for" ": String) и сохранить связь
У меня есть has_many: через ассоциации с почтой, post_category и, как присоединиться таблицы категоризации следующим образом:
Почте Модель:
class Post < ApplicationRecord
has_many :categorizations
has_many :post_categories, :through => :categorizations
end
В Post :: категории Модель (используется для улучшения Пространства имен структуры проекта):
class Post::Category < ApplicationRecord
has_many :categorizations
has_many :posts, :through => :categorizations
end
категоризация Модель (используются class_name, причина именования почт :: Категория):
class Categorization < ApplicationRecord
belongs_to :post
belongs_to :post_category, :class_name => 'Post::Category'
end
И тогда я в представлении отборное, где я создаю пост с post_category:
<div class="form-group">
<%= f.label :post_categories, :class => 'control-label', :value => 'Category: ' %>
<%= f.select :post_categories, options_from_collection_for_select(all_post_categories, :id, :name), {}, {class: 'selectpicker', :'data-live-search' => 'true', required: 'false' } %>
</div>
В posts_controller, я позволил :post_categories
символ:
def post_params
params.require(:post).permit(:post_categories)
end
вот мой файл миграции для Ассоциации:
class CreateCategorizations < ActiveRecord::Migration[5.0]
def change
create_table :categorizations do |t|
t.integer :post_id
t.integer :post_category_id
t.timestamps
end
add_index :categorizations, :post_id
add_index :categorizations, :post_category_id
# multiple-key index enforces uniqueness on (post_id, post_category_id)
# pairs, so that a category can't have the same post twice
add_index :categorizations, [:post_id, :post_category_id], unique: true
end
end
Когда я пытаюсь отправить форму, я получаю следующее сообщение об ошибке в логах:
NoMethodError (undefined method `each' for "3":String):
app/controllers/posts_controller.rb:32:in `create'
Так что я искал ответы на некоторые вопросы в порядке ->You can't assign string to association.
Я пробовал еще один способ заставить ассоциацию работать.
Так что я попытался с помощью post_category_id, как рекомендуется here
Я поставил в избранных мнение о
<%= f.select :post_category_id, options_from_collection_for_select(all_post_categories, :id, :name), {}, {class: 'selectpicker', :'data-live-search' => 'true', required: 'false' } %>
затем в posts_controller позволяют CATEGORY_ID:
def post_params
params.require(:post).permit(:post_category_id)
end
и в Модель сообщения:
class Post < ApplicationRecord
has_many :categorizations
has_many :post_category_id, :through => :categorizations
end
Это новая ошибка:
Could not find the source association(s) "post_category_id" or :post_category_id in model Categorization. Try 'has_many :post_category_id, :through => :categorizations, :source => <name>'. Is it one of post or post_category?
Ok имеет смысл, потому что нет post_category_id
ассоциации.
Обновление:
В post_params:
<ActionController::Parameters {"content"=>"content", "post_categories"=>"2"} permitted: true>
Вы действительно ожидаете, что это 'has_many: post_category_id,: through =>: категоризация' работать? –
@AndreyDeineko Это была попытка показать, что я попробовал другой подход. Да, но в конце концов это определенно не сработает – ronatory
Вы могли бы добавить параметры (из журналов) из создания действия при создании сообщения? (При первоначальной настройке) –