2012-05-28 4 views
3

У меня есть таблица статусов, которая содержит только поле id и name (Active, Inactive, Pending и т. Д.). Затем у меня есть таблицы, такие как «Пользователи», «Достижения», «Значки», для которых каждый из них содержит внешний ключ status_id. Являются ли ассоциации в моих моделях правильными?Rails Ассоциации для поиска Таблица

class Status < ActiveRecord::Base 
    has_many :achievements 
    has_many :badges 
    has_many :users 
end 

class User < ActiveRecord::Base 
    belongs_to :status 
end 

class Badge < ActiveRecord::Base 
    belongs_to :status 
end 

class Achievement < ActiveRecord::Base 
    belongs_to :status 
end 

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

ответ

8

Простейшая установка ассоциации будет:

class User < ActiveRecord::Base 
    has_one :status 
end 

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

@user = User.find(1) 
@user.status 

Если с другой стороны, вы хотели простую семантику для показа всех пользователей с определенным статусом, то вы бы добавить

class Status < ActiveRecord::Base 
    has_many :users 
end 

так что теперь вы можете сделать:

@status = Status.find_by_description('Active').first() 

@status.users 

Обратите внимание, что в обоих случаях все, что нужно для модели пользователей, чтобы иметь атрибут «status_id»

BELONGS_TO лучше подходит, когда существует неявная иерархия, я, е,

class Child << ActiveRecord::Base 
    belongs_to :parent 
end 
+0

Спасибо за подробный ответ. Что касается belongs_to ... Я прочитал некоторую документацию на сайте rails, в которой говорится, что таблица, содержащая внешний ключ, содержит свойство belongs_to в модели. – user1084769

+1

Это правда, но вопрос в том, нужна ли вам семантика, введенная belongs_to? то есть пользователь имеет один статус, но статус принадлежит пользователю? Статус не принадлежит пользователю, статус может быть назначен нескольким пользователям, поэтому вам, вероятно, никогда не понадобится семантика запросов, которая говорит, покажите мне пользователя, который принадлежит этому статусу. – RadBrad

+0

, что на самом деле было очень хорошим способом объяснить это. большое спасибо! – user1084769

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