Как получить поля из has_many: через ассоциацию - PullRequest
0 голосов
/ 05 января 2019

У меня есть ассоциация «многие ко многим» с помощью модели RoomsUsers, и в этой модели у меня есть поле роли, ассоциация работает хорошо, но я не могу получить доступ к этому полю. Моя схема выглядит так:

 create_table "messages", force: :cascade do |t|
   t.text "body"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.integer "user_id"
   t.integer "room_id"
 end                                                                       
 create_table "rooms", force: :cascade do |t|
   t.string "name"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.integer "rooms_user_id"
 end
 create_table "rooms_users", force: :cascade do |t|
   t.integer "user_id"
   t.integer "room_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string "role"
   t.integer "last_checked"
 end
create_table "users", force: :cascade do |t|
  t.string "name"
  t.string "password_digest"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.string "mail"
  t.integer "rooms_user_id"
end

Модель пользователя:

class User < ApplicationRecord
  has_secure_password(validations: false)
  has_many :messages
  has_many :rooms_users
  has_many :rooms, through: :rooms_users
  accepts_nested_attributes_for :rooms_users
  attr_accessor :register, :mail_confirmation, :login
end

Модель номера:

class Room < ApplicationRecord
  has_many :rooms_users
  has_many :users, through: :rooms_users
  accepts_nested_attributes_for :rooms_users
  has_many :message
end

RoomsUsers модель:

class RoomsUsers < ApplicationRecord
  belongs_to :user
  belongs_to :room
end

И я пытаюсь получить поле роли из комнаты первого пользователя.

User.first.rooms.first.role

Это дает мне NoMethodError (неопределенный метод `role 'для #). Что не так?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Если вы хотите получить доступ к полю «роль» через модель Rooms, вам нужно изменить место своего поля «роль» с таблицы rooms_users на таблицу комнат. Делая это, вы можете получить доступ к «роли», используя User.first.rooms.first.role.

Однако, если вы хотите сохранить поле "роль" в таблице rooms_users, вам нужно будет использовать User.first.rooms_users.first.role, поскольку Vasilisa уже упоминалось.

t.integer "rooms_user_id" не нужны в таблицах комнат и пользователей. Has_many, используемый в комнатах, и пользователи уже связывают с ними rooms_users.

0 голосов
/ 05 января 2019

Вы пытаетесь получить доступ к полю role в таблице rooms, но оно находится в таблице rooms_users. Должно быть:

User.first.rooms_users.first.role

И удалите rooms_user_id из rooms и users таблицы, вам это не нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...