Как получить доступ к ActiveRecords связанных объектов - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть две таблицы, qip_changes и mac_addresses, которые имеют отношение own_to.Когда я пытаюсь получить доступ к таблице mac_address из объекта класса QipChange, я сталкиваюсь с "неопределенным методом` MyDbColumName = 'для nil: NilClass "

, я могу получить свои данные, но я не могу записать в связанныйтаблица:

2.4.1 :044 > i = QipChange.first
QipChange Load (0.5ms)  SELECT  "qip_changes".* FROM "qip_changes" ORDER BY 
"qip_changes"."id" ASC LIMIT $1  [["LIMIT", 1]]
 => #<QipChange id: 2, created_at: "2018-08-21 08:31:48", updated_at: 
"2018-08-21 08:31:48", tenant: "BMC-Test", object_type: "Subnet", action: 
"add", object_data: "blabalalaalla", implementation_status: "started", 
server_response: "", user_id: 1, user_cache: "test"> 
2.4.1 :045 > i.mac_address
MacAddress Load (0.6ms)  SELECT  "mac_addresses".* FROM "mac_addresses" 
WHERE "mac_addresses"."qip_change_id" = $1 LIMIT $2  [["qip_change_id", 2], 
["LIMIT", 1]]
 => nil 
2.4.1 :046 > i.mac_address.mac_address = "asocnasc"
NoMethodError: undefined method `mac_address=' for nil:NilClass
    from (irb):46

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

мои модели:

class QipChange < ApplicationRecord

  belongs_to :user
  has_one :mac_address
end

class MacAddress < ApplicationRecord
  belongs_to :qip_change
end

от psql:

ipmatedevel=# \d mac_addresses
                                       Table "public.mac_addresses"
    Column     |            Type             |                         Modifiers
---------------+-----------------------------+------------------------------------------------------------
 id            | bigint                      | not null default nextval('mac_addresses_id_seq'::regclass)
 mac_address   | character varying           |
 created_at    | timestamp without time zone | not null
 updated_at    | timestamp without time zone | not null
 qip_change_id | bigint                      |
Indexes:
    "mac_addresses_pkey" PRIMARY KEY, btree (id)
    "index_mac_addresses_on_qip_change_id" btree (qip_change_id)
Foreign-key constraints:
    "fk_rails_8002186396" FOREIGN KEY (qip_change_id) REFERENCES qip_changes(id)

qipmatedevel=# \d qip_changes
                                           Table "public.qip_changes"
        Column         |            Type             |                        Modifiers                         
-----------------------+-----------------------------+----------------------------------------------------------
 id                    | bigint                      | not null default nextval('qip_changes_id_seq'::regclass)
 created_at            | timestamp without time zone | not null
 updated_at            | timestamp without time zone | not null
 tenant                | character varying           | 
 object_type           | character varying           | 
 action                | character varying           | 
 object_data           | character varying           | 
 implementation_status | character varying           | 
 server_response       | character varying           | 
 user_id               | bigint                      | 
 user_cache            | character varying           | not null
Indexes:
    "qip_changes_pkey" PRIMARY KEY, btree (id)
    "index_qip_changes_on_user_id" btree (user_id)
Foreign-key constraints:
    "fk_rails_3207a22986" FOREIGN KEY (user_id) REFERENCES users(id)
Referenced by:
    TABLE "mac_addresses" CONSTRAINT "fk_rails_8002186396" FOREIGN KEY (qip_change_id) REFERENCES qip_changes(id)

edit: так что мне любопытно, если моя ассоциация работает.Так как запрос создается после того, как я ввожу «i.mac_address», кажется, что это работает, я прав?

edit:

i.create_mac_address(mac_address: "aconasic")

, который работал для создания mac_address.Что мне нужно сделать, чтобы получить доступ к нему, начиная с i?

работает после того, как mac_address был создан:

i.mac_address.mac_address

1 Ответ

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

Если вы хотите обновить атрибут в рельсах, вам нужно сделать

 TABLE_NAME.update(ATTRIBUTENAME: "")

Например, если вы хотите обновить mac_address, вам нужно сделать

i.mac_address.update(mac_address: "asocnasc")

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

Если вы хотите создать новый mac_address для qipChange, вам нужно сделать

i.create_mac_address(mac_address: MAC_ADDRESSS) here i is your QIPCHANGE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...