Вставка атрибута в таблицу соединений - PullRequest
0 голосов
/ 10 июня 2018

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

Это организовано следующим образом ... У меня есть модель таблицы счетов:

class TabAccount < ApplicationRecord
  has_many :tab_client_project_accounts
  has_many :tab_projects, through: :tab_client_project_accounts
end

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

class TabClientProjectAccount < ApplicationRecord
  belongs_to :tab_account
  belongs_to :tab_project
end

Чтобы присоединиться к модели таблицы проекта:

class TabProject < ApplicationRecord
  has_many :tab_client_project_accounts
  has_many :tab_accounts, through: :tab_client_project_accounts
end

В моем контроллере я использую оператор лопатой для добавления учетных записей в проекты:

@this_project.tab_accounts << _new_account unless @this_project.tab_accounts.include?(_new_account)

И этоработает как задумано.Но я также хочу вставить значение в мою таблицу соединений tab_client_project_accounts как часть этого оператора.Это возможно?Какая нормальная лучшая практика для этого?

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Если вам нужно больше столбцов в объединяемой таблице, подход << (без явного использования соединительной таблицы) не будет работать, поскольку он не устанавливает никаких дополнительных атрибутов.Вместо этого вы можете использовать модель соединения:

Ваша версия (без таблицы соединения):

@this_project.tab_accounts << _new_account unless @this_project.tab_accounts.include?(_new_account)

Использование таблицы соединения:

@this_project.tab_client_project_accounts.build(
  tab_account: _new_account, 
  additional_data: 'anything_you_need'
) unless @this_project.tab_accounts.include?(_new_account)
0 голосов
/ 11 июня 2018

Я только что заработал, как задумано;вот что у меня есть:

_account_type_list_member_id = RefAccountType.find_by_typename('List Member').id

@this_project.tab_client_project_accounts.build(
  :tab_account => _new_account,
  :ref_account_type_id => _account_type_list_member_id
).save unless @this_project.tab_accounts.include?(_new_account)
0 голосов
/ 10 июня 2018

Вот что вы можете сделать

tp = TabProject.find 1

tp.tab_client_project_accounts.build tab_account: TabAccount.find 1

или

tp.tab_client_project_accounts.build tab_account: TabAccount.create(name: 'Some Account Name')

tp.save!

Это обеспечит запись во всех таблицах

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