1

Я создаю сайт, на котором пользователи могут создавать идеи программирования для школьных проектов по программированию. Они могут просматривать все идеи и записывать (подписываться) в идею, которую создал другой пользователь. Кнопка регистрации будет на странице показа идеи от пользователяRails 4: Как реализовать ассоциацию модели, посредством которой пользователь может зарегистрировать (подписаться) в адрес других пользователей

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

Я как бы новичок в рельсах и только что закончил учебник Rails от Michael Heartl.

Это мой код:

class User < ActiveRecord::Base 
    has_many :ideas 
    has_many :enrolled_ideas, through: :enrollments, dependent: :destroy, class_name: "Idea" 

class Idea < ActiveRecord::Base 
    belongs_to :user 

WebappProject::Application.routes.draw do 
    resources :users 
    resources :sessions, only: [:new, :create, :destroy] 
    resources :ideas do 
    member do 
     get :enrolled 
    end 
    end 

Идеи на домашней странице (static_pages контроллер), который пользователь может нажать на кнопку. Затем он отправляется на страницу показа и идеи (idea_controller) через действие show. На этой странице (конкретная идея от пользователя) я хочу кнопку «Записаться». Поэтому, если пользователь нажимает на нее, владелец идеи может перечислить на странице своего пользователя, всех зарегистрированных пользователей.

ответ

1

Есть два способа сделать таблицы «И» и «Множество (HABTM) в Rails, оба используют промежуточную таблицу. То, что ваш учитель, вероятно, имел в виду, заключается в том, что существует способ сделать отношения HABTM без добавления третьей модели. Таким образом, вы можете иметь:

class User < ActiveRecord::Base 
    has_and_belongs_to_many :ideas 
end 

class Idea < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

Таким образом, вы можете запустить

User.first.ideas #to get all the ideas a user created or is subcribed to 
Idea.first.users #to get all the users subscribed to an idea 
Idea.first.users << User.first # to subscribe the first user to the first idea 

Но вы все равно должны создать миграцию для промежуточной таблицы следующего convetions Rail, которая в этом случае будет:

class CreateUsersIdeas < ActiveRecord::Migration 
    def change 
    create_table :users_ideas do |t| 
     t.belongs_to :user 
     t.belongs_to :idea 
    end 
    end 
end 

Вы можете узнать больше об этом типе отношений на http://guides.rubyonrails.org/association_basics.html (2.6 Ассоциация has_and_belongs_to_many)

Второй способ является более гибким, поскольку он позволяет добавлять поля в таблице отношений нуждается в промежуточной модели, как так:

class User < ActiveRecord::Base 
    has_many :subscriptions 
    has_many :ideas, through: :subscriptions 
end 

class Subscriptions < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :idea 
end 

class Idea < ActiveRecord::Base 
    has_many :subscriptions 
    has_many :users, through: :subscriptions 
end 

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

+0

Ahh thanks !!, я пошел на второй вариант и создал отдельную таблицу подписки. На стороне «Пользователи» я отправился на «has_many: signeded_by через:: subscriptions, источник:: пользователь», так что теперь я могу получить всех пользователей, подписавшихся на сообщение. –