ruby on rails

many-to-many association

흰두부1 2020. 11. 23. 13:13
rails generate resource UserStock user:references stock:references

user와 stock의 M:M association 설정을 위해 UserStock resource를 생성한다.

      invoke  active_record
      create    db/migrate/20201123034604_create_user_stocks.rb
      create    app/models/user_stock.rb
      invoke    test_unit
      create      test/models/user_stock_test.rb
      create      test/fixtures/user_stocks.yml
      invoke  controller
      create    app/controllers/user_stocks_controller.rb
      invoke    erb
       exist      app/views/user_stocks
      invoke    test_unit
      create      test/controllers/user_stocks_controller_test.rb
      invoke    helper
      create      app/helpers/user_stocks_helper.rb
      invoke      test_unit
      invoke    assets
      invoke      scss
      create        app/assets/stylesheets/user_stocks.scss
      invoke  resource_route
       route    resources :user_stocks

위와 같이 파일들이 생성된다.

❯ rails routes --expanded | grep user_stocks
Prefix            | user_stocks
URI               | /user_stocks(.:format)
Controller#Action | user_stocks#index
URI               | /user_stocks(.:format)
Controller#Action | user_stocks#create
URI               | /user_stocks/new(.:format)
Controller#Action | user_stocks#new
URI               | /user_stocks/:id/edit(.:format)
Controller#Action | user_stocks#edit
URI               | /user_stocks/:id(.:format)
Controller#Action | user_stocks#show
URI               | /user_stocks/:id(.:format)
Controller#Action | user_stocks#update
URI               | /user_stocks/:id(.:format)
Controller#Action | user_stocks#update
URI               | /user_stocks/:id(.:format)
Controller#Action | user_stocks#destroy

라우트도 확인

 

user.rb와 stock.rb model에 (validation과) association을 설정해준다.

class Stock < ApplicationRecord
  has_many :user_stocks
  has_many :users, through: :user_stocks

  validates :name, :ticker, presence: true
class User < ApplicationRecord
  has_many :user_stocks
  has_many :stocks, through: :user_stocks

 

rails db:migrate로 migrate를 해준 뒤, console로 확인

user = User.first
stock = Stock.first
user.stocks << stock
stock.users << user

위와 같은 식으로 테스트를 해보면, 잘 작동하는 걸 알 수 있다.