2010-12-31 3 views
0

Я новичок программист, много лет занимаюсь оболочкой, но недавно взял на себя программирование ООП с помощью Ruby и создаю приложение Rails.Usng Rails ActiveRecord relationship

Мне нелегко получить голову, обернутую тем, как использовать мои определенные отношения модели.

Я пробовал искать Google, но все, что я могу придумать, это в основном чит-листы для того, что has_many, belongs_to и т. Д. Все это означает. Это легко понять, потому что я много работал непосредственно с SQL.

Я не понимаю, как использовать эти определенные отношения.

В моем случае у меня есть 3 модели: Locations Хосты Услуги

отношения (не фактический код, просто для сокращения его):

Services 
    belongs_to :hosts 

Hosts 
    has_many :services 
    belongs_to :locations 

Locations 
    has_many :hosts 

В этом случае я хочу, чтобы иметь возможность отобразите столбец из местоположений во время работы с Сервисами. В SQL это простое соединение, но я хочу сделать это Rails/Ruby, а также не использовать SQL в моем коде или переопределять мои соединения.

ответ

0

Вы можете определить has_many через Locations.

Locations 
    has_many :hosts 
    has_many :services, :through => :hosts 

Hosts 
    belongs_to :location 
    has_many :services 

Services 
    belongs_to :host 
    has_one :location, :through => :host #This relationship is optional 

Тогда вы могли бы получить доступ к услугам по:

Location.first.services 

Это произведет этот запрос:

SELECT "services".* FROM "services" INNER JOIN "hosts" ON "services".host_id = "hosts".id WHERE (("hosts".location_id = 1)) 

... который будет собирать все услуги для данной местности ,

EDIT: Я понимаю, что вы хотите отношения с другого конца. Для этого вы можете получить доступ к местоположению из службы, выполнив service.host.location, поскольку каждая служба принадлежит одному хосту, и каждый хост принадлежит одному месту. Вы также можете добавить необязательное отношение выше, чтобы вы могли просто ввести имя service.location.column_name.

+0

Кроме того, Сет правильно относится к отношениям, требующим надлежащего плюрализации. Кроме того, ваш запрос для местоположения, вероятно, будет отличаться от «first», но это хорошая иллюстрация того, как это будет достигнуто. –

+0

Has_many through не будет работать, потому что таблица соединения не принадлежит каждой стороне владельца ... – sethvargo

+0

Не правда.Он работает. Он генерирует этот запрос: SELECT «services». * FROM «services» INNER JOIN »принимает« ON »-службы» .host_id = «hosts» .id WHERE ((«hosts» .location_id = 1)) –

0

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

 Service 
     belongs_to :host 

    Host 
     has_many :services 
     belongs_to :location 

    Location 
     has_many :hosts 

Обратите внимание, что теперь отношения на самом деле имеет смысла: ХОСТОВЫЙ HAS_MANY SERVICES, услуга belongs_to хоста и местоположение has_many хостов

Теперь попробуйте на консоли рельсы:

service = Service.create(:name => 'ServiceName')#assuming you only have that field and the host_id of course 
service.host# right after creation will return an empty array...so create a host 
host = Host.create(:name => 'HostName')#assuming you only have that field and the id of course 
#if both were saved to db 
host.services << service 
#or 
service.host << host #should work for you 

вы можете позвонить по номеру

service.host.name   
service.host.id # or any other column you have there