2015-02-10 2 views
1

Скажем, если у меня 3 модели; Отель, курорт и ресторан. Каждая модель имеет схожие атрибуты; название, описание, объекты ... и т. Д.Полезно ли использовать has_one вложенные атрибуты в рельсах?

Если я хочу, чтобы у каждой модели было одно местоположение с атрибутами; Страна, провинция, город, адрес, широта и долгота.

Должен ли я создать модель определения местоположения и использование HAS_ONE вложенные атрибутов или я должен включать атрибуты РАСПОЛОЖЕНИЯ, чтобы те модели? Какой из них предпочтительнее или лучше подходит?

ответ

1

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

Редактировать: Изменение belongs_to :address на belongs_to :locatable, поскольку @vee исправил его.

class Location < ActiveRecord::Base 
    belongs_to :locatable, polymorphic: true 
end 

class Hotel < ActiveRecord::Base 
    has_one :location, as: :locatable  
end 
class Resort < ActiveRecord::Base 
    has_one :location, as: :locatable  
end 
class Restaurant < ActiveRecord::Base 
    has_one :location, as: :locatable  
end 

Подробнее: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

Надеется, что это помогает.

+1

Порекомендуйте следующее соглашение об именах и обновите 'belongs_to' до': locatable' и 'Hotel',' Resort' и 'Restaurant'' has_one', чтобы 'has_one: location, as:: locatable'. – vee

+0

Большое спасибо за ваши ответы, я никогда раньше не сталкивался с полиморфной ассоциацией. Попробуй попробовать – settawut

+0

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

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