Относится к значению поля - PullRequest
       28

Относится к значению поля

0 голосов
/ 09 сентября 2010

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

Каждый тип учетной записи имеет одну таблицу, account_site и account_page. Так что обычный belongs_to не подойдет.

Так есть ли способ вернуть что-то вроде:

belongs_to :account, :class_name => "AccountSite", :foreign_key => "account_id" if cindof = 1
belongs_to :account, :class_name => "AccountPage", :foreign_key => "account_id" if cindof = 2

Попытался сделать это методом allso, но не повезло. Действительно хочу иметь только одно account, а не разные belongs_to имена. Кто-нибудь может понять, чего я хочу? Трудно объяснить по-английски.

Terw

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

Вы должны быть в состоянии делать то, что вы хотите с полиморфной ассоциацией. Это не включит cindof по умолчанию, но это не может быть проблемой.

class ObjectWithAccount < ActiveRecord::Base
  belongs_to :account, :polymorphic => true
end

class AccountSite < ActiveRecord::Base
  has_many :objects_with_accounts, 
        :as => :account, 
        :class_name => 'ObjectWithAccount'
end

class AccountPage < ActiveRecord::Base
  has_many :objects_with_accounts, 
        :as => :account, 
        :class_name => 'ObjectWithAccount'
end

Вам понадобится столбец account_id и столбец account_type. Тип объекта учетной записи затем сохраняется в столбце дополнительного типа.

Это позволит вам сделать:

obj.account = AccountPage.new

или

obj.account = AccountSite.new
0 голосов
/ 09 сентября 2010

Я бы посмотрел на наследование одной таблицы. Не уверен на 100%, но я думаю, что это решит вашу проблему http://code.alexreisner.com/articles/single-table-inheritance-in-rails.html

Если это нехорошо, это не так сложно реализовать самостоятельно.

def account
  case self.cindof
    when 1 then AccountSite.find self.account_id
    when 2 then AccountPage.find self.account_id
  end
end
...