многие ко многим с множественным выбором в Rails - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть модель с именем Article, другая модель с именем Organization и таблица соединений с именем ArticleAllowedOrganization, в которой есть article_id и organization_id.

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

Когда я тестирую в консоли, кажется, что он работает правильно, однако, когда я создаю статью в веб-приложении, параметры для сквозной ассоциации allowed_organization_ids пустые.

Модель статьи:

class Article < ActiveRecord::Base
  has_many :article_allowed_organizations, dependent: :destroy
  has_many :allowed_organizations, through: :article_allowed_organizations, source: :organization
end

Модель организации:

class Organization < ActiveRecord::Base
    has_many :article_allowed_organizations, dependent: :destroy
    has_many :allowed_articles, through: :article_allowed_organizations, source: :article
end

таблица соединений:

class ArticleAllowedOrganization < ActiveRecord::Base
  belongs_to :article
  belongs_to :organization
end

в article_controller.rb Я разрешил массив для allow_organization_ids

def article_params
  params.require(:article).permit(:other_stuff, :allowed_organization_ids => [])
end

В форме:

  <%= f.collection_select(:allowed_organization_ids, Organization.order(:name), :id, :name,
                                    {include_blank: true}, {multiple: true}) %> 

В консоли я могу вручную установить несколько идентификаторов организации, которые будут связаны со статьей, и это работает.

     a = Article.last
     a.allowed_organization_ids = [2, 4]

ниже вы можете видеть, что он вставляет идентификаторы для организации в таблицу ArticleAlllowedOrganization при использовании консоли.

 (0.3ms)  BEGIN
  SQL (1.3ms)  INSERT INTO "article_allowed_organizations" ("article_id", "organization_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["article_id", 95], ["organization_id", 4], ["created_at", "2018-12-12 17:47:25.978487"], ["updated_at", "2018-12-12 17:47:25.978487"]]
   (6.5ms)  COMMIT
=> [2, 4]

при использовании веб-приложения я получаю это вжурнал, где allowed_organization_ids ничего не передает.

  Parameters: {"....some_other_params" "allowed_organization_ids"=>[""]}

, если я пытаюсь использовать collection_check_boxes

  <%= f.collection_check_boxes :allowed_organization_ids, Organization.all, :id, :name do |b| %>
     <div class="collection-check-box">
       <%= b.check_box %>
       <%= b.label %>
     </div>
 <% end %>

Я получаю это в журнале при использовании collection_check_boxes, гдевместо идентификаторов организации указано true

"allowed_organization_ids"=>["true"]

также интересно то, что я также получаю в журнале нижеприведенное письмо, когда пытаюсь использовать флажки, когда пытается найти организацию с идентификатором 0, но можетт, который препятствует отправке формы.

  [1m[35mOrganization Load (0.5ms)[0m  SELECT  "organizations".* FROM "organizations" WHERE "organizations"."id" = $1 LIMIT 1  [["id", 0]]
Completed 404 Not Found in 67ms (ActiveRecord: 2.4ms)

ActiveRecord::RecordNotFound (Couldn't find Organization with 'id'=0):

1 Ответ

0 голосов
/ 16 декабря 2018

Пожалуйста, проверьте следующие несколько вопросов.В вашем контроллере вы вводите

def article_params
  params.require(:article).permit(:other_stuff, :allowed_organization_ids => [])
end

Итак, вы уже говорите, что ваш allow_organization_ids пуст, пожалуйста, замените его следующим:

def article_params
  params.require(:article).permit(:other_stuff, :allowed_organization_id)
end

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

class ArticleAllowedOrganization < ActiveRecord::Base
  belongs_to :article
  belongs_to :organization
end

должно бытьallow_article и allow_organization

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

  rails new SampleProject && cd $_ && bundle 

  rails g model Article title:string description:text
  rails g model Organization name:string
  rails g model Allowed permission:string article:references organization:references

Теперь убедитесь, что ваша модель Article соответствует следующим требованиям.

class Article < ActiveRecord::Base
  has_many :alloweds
  has_many :organizations, through: :alloweds
end

А в вашей модели организации

класса Organization

И в вашей разрешенной модели, хотя я буду использовать разрешениечем разрешено имя таблицы, но это ваше имя.

class Allowed < ActiveRecord::Base
 belongs_to :article
 belongs_to :organization
end

Теперь давайте сгенерируем представления и контроллеры

rails g scaffold_controller Article title:string description:string
rails g scaffold_controller Organization name:string
rails g scaffold_controller Article title:string description:string

Теперь добавьте маршруты в ваш config / rout.rb

resources :articles
resources :organizations
resources :alloweds

Теперь вы можете запустить свой железнодорожный сервер и перейти к / Articles, / Organization и / позволяет увидеть, как он работает.Автоматический генератор Rails использует текстовое поле для идентификаторов отношений, так что вы можете поставить идентификаторы вручную, и это будет работать.

Надеюсь, это понятно.

...