Несколько ассоциаций в модели - PullRequest
3 голосов
/ 26 марта 2012

У меня есть модель пользователя и модель учетной записи.У пользователя много учетных записей, и учетные записи принадлежат одному пользователю.У меня есть все модели и ассоциации.Теперь я хочу сделать одну из этих учетных записей "основной учетной записью".Каков наилучший способ создания ассоциаций?Я добавил столбец primary_account_id в свою пользовательскую таблицу и настроил ассоциации, как это, но это не сработало.Любые советы?

class User < ActiveRecord::Base
   has_many :accounts
   has_one :primary_account, :class_name => "Account"
end

class Account < ActiveRecord::Base
   belongs_to :user
end

Редактировать

Я вижу этот вопрос Модель Rails, которая имеет 'has_one' и 'has_many', но с некоторыми ограничениями что очень похоже, и второй ответ дает предложение, которое я попробовал.Однако, когда я использую его, rails игнорирует созданный мной столбец и просто берет первый в таблице:

>> u = User.find(1)
  User Load (3.9ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
=> #<User id: 1, email: "XXXXXXX@gmail.com", created_at: "2012-03-15 22:34:39", updated_at: "2012-03-15 22:34:39", primary_account_id: nil>
>> u.primary_account
  Account Load (0.1ms)  SELECT "accounts".* FROM "accounts" WHERE "accounts"."user_id" = 1 LIMIT 1
=> #<Account id: 5, name: "XXXXXX", created_at: "2012-03-16 04:08:33", updated_at: "2012-03-16 17:57:53", user_id: 1>
>> 

1 Ответ

6 голосов
/ 26 марта 2012

Итак, я создал простую ERD, и ваша проблема очень проста, но я думаю, что нашел серьезную проблему:

simple erd

class User < ActiveRecord::Base
   has_many :accounts
   has_one :primary_account, :class_name => "Account", :primary_key => "account_pimary_id"
end

class Account < ActiveRecord::Base
   belongs_to :user
end

Чтобы получить ассоциации как есть, просто установите :primary_key на has_one :primary_account, чтобы он использовал users.account_primary_id вместо users.id.

Хотя это работает, это, вероятно, не вызовет ничего, кроме проблем. Если user_id Учетной записи используется в качестве внешнего ключа для id и account_primary_id, вы не представляете, является ли Учетная запись обычной Учетной записью или Основной Учетной записью, без явного присоединения к id и account_primary_id каждый раз. foreign_key должен указывать только на 1 столбец, в данном случае на таблицу пользователя id. Тогда это прямой выстрел в таблицу учетной записи.

@ Решение Zabba является разумным, но для объединения требуется :include

has_one :primary_account, :class_name => "Account", :conditions => "users.primary_account_id = accounts.id", :include => :user

Это означает, что все учетные записи принадлежат пользователю, и только 1 помечается как основная учетная запись. Красиво и прямо, избегая дурацких пунктов где.

...