2013-10-03 4 views
0

Я читал руководство по ассоциациям, но я чувствую, что все еще не полностью понимаю, поэтому я хочу задать пару вопросов, чтобы быть уверенными. Предположим, я создаю приложение, которое, среди прочего, перечислит крупные города по всему миру. Я планировал бы иметь представление, которое начинается на уровне континента и может быть отфильтровано. Поэтому я бы начал с модели Continent. А затем модель страны. Теперь, в рамках модели Continent, я бы определил ассоциацию как has_many: страны. И в модели страны я бы использовал belongs_to: континенты. Я так понимаю. Поэтому моя следующая модель будет моделью для штатов/провинций. Давайте просто назовем это провинцией, поскольку это более распространено во всем мире. Итак, теперь у меня есть моя провинциальная модель, и я бы использовал принадлежность к стране. А также у стран было бы много: провинций. Мой первый вопрос: как я описываю связь между провинцией и континентом? Has_many через описывает ассоциации, в которых у обеих моделей много. В провинции только один Континент. Has_one through описывает взаимосвязь между объектами, которые имеют отношение один к одному через третий объект. Опять же, это не так, потому что на континенте будет много провинций. Итак, это мой основной вопрос ... как описывать отношения, которые существуют в контексте от одного до многих через контекст. Мой второй вопрос будет просто просить советы по написанию миграции для этого в ситуации, когда я добавляю еще один слой, скажем, графство, позже. Но главная проблема - просто понять, как выразить отношения, которые я описал. Или если они даже должны быть выражены.has_many/принадлежит к ассоциациям в RoR

ETA: Если бы мне пришлось использовать ассоциацию has_many_through, мне обязательно нужно создать таблицу соединений (continent_province), или я могу просто использовать таблицу стран, т.е. has_many: provinces -> through: countries?

+0

Многое зависит от того, как вы хотите использовать данные. Вам не нужно определять прямую связь между континентом и провинцией, если вам не нужна эта прямая связь. В таком случае, да, вы можете сделать 'has_many_through'. Он будет ассоциировать многие провинции с каждым континентом. – lurker

+0

Спасибо за ответ. Меня беспокоит ассоциация has_many_through по двум причинам. Во-первых, он определяется как от многих до многих, а не от нескольких. Во-вторых, если бы я использовал has_many_through, мне нужно было бы создать таблицу соединений и использовать таблицу соединений в качестве таблицы «через»? Казалось бы, имеет смысл использовать «Страны» в качестве «сквозной» таблицы, но это не является целью таблицы стран. Или я просто передумал это? Это было известно. –

+0

Вы читали http://guides.rubyonrails.org/association_basics.html? – lurker

ответ

1

Не зацикливайтесь на нескольких небольших примерах в каком-то документе. Поддержка отношений великолепно гибкая. В конце концов, просто попробуй - у меня есть приложение Tester, в котором есть всевозможные доказательства концепций - вот его цель.


class Project 
    # one-to-many 
    has_many :scenarios 
    # linking through scenarios 
    has_many :unittests, :through => :scenarios 
    # polymorphic relationship, everything can be relation to one or more appls 
    has_many :appllinks, :as => :applinkable, :dependent => :destroy 
    has_many :appls, :through => :appllinks, :order => 'name' 
    blah blah blah 
end 

class Scenario 
    # many-to-one 
    belongs_to :project 
    # many-to-many 
    has_many :scenariotests 
    has_many :unittests, :through => :scenariotests 
    # polymorphic relationship, everything can be relation to one or more appls 
    has_many :appllinks, :as => :applinkable, :dependent => :destroy 
    has_many :appls, :through => :appllinks, :order => 'name' 
    blah blah blah 
end 

class Unittest 
    # many-to-many 
    has_many :scenariotests 
    has_many :scenarios, :through => :scenariotests 
    # polymorphic relationship, everything can be relation to one or more appls 
    has_many :appllinks, :as => :applinkable, :dependent => :destroy 
    has_many :appls, :through => :appllinks, :order => 'name' 
    blah blah blah 
end 
Смежные вопросы