Настройка Has_Many: через ассоциацию - PullRequest
0 голосов
/ 30 апреля 2011

В приложении, над которым я сейчас работаю, я застрял в настройке связей между 3 моделями для обеспечения ссылочной целостности.У меня есть модель событий, модель здания и модель комнаты.Ассоциация в реальной жизни довольно интуитивна.Событие может быть только в одном здании и одной комнате.В здании может быть несколько комнат.

Вот то, что я сейчас настроил.Однако как События могут указать свою комнату, если они принадлежат Зданиям, а внешний ключ для Комнаты находится в таблице Событий?Это где вы используете отношение has_many: through?Рекомендуется ли хранить внешние ключи здания и комнаты в таблице событий, поскольку комнаты принадлежат зданиям?А как насчет условных отношений, которые требуют указания здания, прежде чем разрешить указание комнаты (в некоторых зданиях есть 2 комнаты, в других, например, 20)

Извините, я так неясен по этому поводу.Заранее спасибо за помощь!

    class Event < ActiveRecord::Base
    belongs_to :building

    end

    class Building < ActiveRecord::Base
    has_many :events
    has_many :rooms

    end

    class Room < ActiveRecord::Base
    belongs_to :building

    end

Ответы [ 2 ]

1 голос
/ 19 апреля 2017

Я бы порекомендовал следующее:

class Event < ActiveRecord::Base
 belongs_to :room
 has_one :building, through: :room
end

class Building < ActiveRecord::Base
 has_many :events, through: :rooms
 has_many :rooms
end

class Room < ActiveRecord::Base
 belongs_to :building
 has_many :events
end

Таким образом, вы можете сделать @room.events, @event.building, @building.events

1 голос
/ 30 апреля 2011

Я думаю, что лучший способ справиться с этим - сделать что-то вроде следующего:

class Event < ActiveRecord::Base
 belongs_to :room
 has_one :building, :through => :room
end

class Building < ActiveRecord::Base
 has_many :events
 has_many :rooms
end

class Room < ActiveRecord::Base
 belongs_to :building
end

Таким образом, вы можете использовать has_one: through, чтобы указать, что событию принадлежит отель

...