2013-03-19 2 views
1

Я новичок в Ruby on Rails, и я пытаюсь понять абстрактный класс. Может быть, я все еще имею в виду структуру Java ...Ruby on Rails has_many и полиморфизм

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

class Address < ActiveRecord::Base 
    belongs_to :addressable, :polymorphic => true 
end 

class Person < ActiveRecord::Base 
    has_one :address, :as => :addressable 
end 

class Company < ActiveRecord::Base 
    has_one :address, :as => :addressable 
end 

Все работает нормально. Теперь у нас разные пользователи, у каждого есть адресная книга.

class User < ActiveRecord::Base 
    has_one :addressbook 
end 

class Addressbook < ActiveRecord::Base 
    has_many ?????? 
end 

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

ответ

2

Вот решение вашей проблемы:

Ваш Person и Company обязательно belongs_to Addressbook. Addressbookhas_many:persons и has_many:companies. Addressbookhas_many:person_addresses и has_many:company_addresses (с использованием :through)

После, вы можете определить функцию addresses, которая является объединением person_addresses и company_addresses.

Другое решение - объявить суперкласс для Person и Company, например, Addressable. Я думаю, что это красивее.

class Address < ActiveRecord::Base 
    belongs_to :addressable 
end 

class Addressable < ActiveRecord::Base 
    has_one :address 
    belongs_to :addressbooks 
end 

class Person < Addressable 
end 

class Company < Addressable 
end 

class User < ActiveRecord::Base 
    has_one :addressbook 
end 

class Addressbook < ActiveRecord::Base 
    has_many :addressables 
    has_many :addresses, :through => :addressables 
end 
+0

Да, суперкласс кажется лучшим, есть ли у вас какие-либо намеки, как я должен это делать? Я буду google, но я не очень комфортно ныряю в этих концепциях, так как я очень новичок в Rails. –

+0

Я редактирую свой пост, чтобы показать вам, как это сделать. – pierallard

+0

О, ничего себе! Большое спасибо! Я пытаюсь это прямо сейчас! –

Смежные вопросы