2015-04-15 2 views
2

У меня есть две модели Пользователь и модель Hobbie. У Хобби уже 4 записи, такие как музыка, спорт, книги и другие.принадлежит_to и has_many проблемы ассоциации

Тогда я форма, где я могу создать пользователь и там я могу выбрать из флажков тех Хобби, по крайней мере 2.

User.rb

has_many: hobbies 

Hobbie.rb

belongs_to :user 

Форма:

<%= form_for(@user, :remote=>"true",:html => {:id=>"new_user","data-parsley-validate" => true,:multipart => true}, remote: true ,format: :json) do |f| %> 
       ... 

     <% @hobbies.each do |hobbie| %> 
       <li> 

       <%= check_box_tag 'hobbie_ids[]',hobbie.id%> <%= h hobbie.name %>      
       </li>   
       <%= f.submit %> 
     <% end %> 
    <% end %> 

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

t= User.last 
t.hobbies => "music", "sports" 

Проблема: Когда я иду для второго пользователя и выбрать хобби, как спорт и книги и сохранить.

Затем в консоли:

t.User.last 
t.hobbies => "sports" and "books" 

Но для первого пользователя есть только "музыка" ушла.

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

Спасибо.

ответ

3

Стандарт has_many: belongs_to отношение в рельсах допускает только один user за hobby.

Это связано с тем, что связь определяется одним целым столбцом (user_id) на таблице hobby. Следующее изображение из Rails Guides иллюстрирует эту зависимость:

has_many relationship illustration

То, что вы, скорее всего, ищете является has_and_belongs_to_many relationsship:

Image from Rails Guides

class User < ActiveRecord::Base 
    has_and_belongs_to_many :hobbies 
end 

class Hobby < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

class CreateUsersAndHobbies < ActiveRecord::Migration 
    def change 
    create_table :users do |t| 
     t.string :name 
     t.timestamps null: false 
    end 

    create_table :hobbies do |t| 
     t.string :name 
     t.timestamps null: false 
    end 

    create_table :users_hobbies, id: false do |t| 
     t.belongs_to :user, index: true 
     t.belongs_to :hobby, index: true 
    end 
    end 
end 

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

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