rails3 и правильный способ использования ассоциаций - PullRequest
0 голосов
/ 17 июня 2011

Я делаю свое первое приложение rails (3).

Ассоциации не имеют смысла. Во-первых, даже направляющие рельсов не действительно объясните, что они делают, они просто объясняют, как их использовать. Из того, что я понимаю, ассоциации делают две вещи:

    a) Allow ActiveRecord to optimize the structure of the database.
    b) Allow ActiveRecord to offer an alternate ruby syntax for
       joins and the like (SQL queries). I want this.

Я пытаюсь понять ассоциации и как правильно их использовать. Основан в приведенном ниже примере кажется, что ассоциации «нарушены» или, по крайней мере, документация.

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

Есть 3 соответствующие таблицы для этого обсуждения. Для ясности я просто включил в таблицу определение инструмента annotate (1) и удалил ненужные поля / столбцы.

Таблица управления списками слов:

    Table name: wordlist_mgmnt_records
    id         :integer         not null, primary key
    byline_id  :integer(8)      not null

Таблица, которая отображает слова в список слов:

    Table name: wordlists
    wordlist_mgmnt_id :integer         not null
    word_id           :integer         not null

На самом деле нам нет дела до самих слов. Но мы заботимся о последняя таблица, bylines:

    Table name: bylines
    id           :integer(8)      not null, primary key
    teacher_id   :integer         not null
    comment      :text            not null

Bylines записывают, кто, какой инструмент использовался, где, когда и т.д. Bylines в основном используется для устранения неполадок, что случилось, чтобы я мог объяснить пользователям, что они должны были сделать (и / или исправить свои ошибки).

Учитель может изменять одну или несколько записей управления списком слов одновременно (он же однопоточный). Иными словами, одно изменение может обновить несколько списки слов.

Для wordlist_mgmnt_records ассоциации будут:

    has_many :bylines       # the same byline id can exist
                            # in many wordlist_mgmnt_records

Но какова соответствующая запись для bylines?

Книга Beginning Rails 3 (Carneiro, et al) гласит:

    "Note: For has_one and has_many associations, adding a belongs_to
    on the other side of the association is always recommended. The
    rule of thumb is that the belongs_to declaration always goes in
    the class with the foreign key."

[Да, я также посмотрел онлайн-руководство по рельсам для этого. не имели Помогите. ]

Что касается таблицы / класса bylines, я действительно хочу сказать?

    belongs_to :wordlist_mgmnt_records

Это действительно не имеет смысла. таблица байлингов в основном принадлежит каждая таблица в базе данных с bylines_id. Так бы я действительно сказал принадлежит всем им? Разве это не установило бы внешние ключи во всех другие таблицы? Это, в свою очередь, сделает изменения дороже (слишком много Циклы процессора) чем я действительно хочу. Некоторые изменения затронули множество таблиц, некоторые они очень большие. Я ценю скорость при обычном использовании и готов ждать найти заголовки без внешних ключей при использовании заголовков для очистки / ремонта.

Что дает нам полный круг. Что на самом деле делают ассоциации в рельсах, и как их разумно использовать?

Просто использование ассоциаций, потому что вы не можете быть правильным ответьте, но как иначе получить добавленный синтаксис объединения?

1 Ответ

0 голосов
/ 17 июня 2011

Я постараюсь помочь вашему замешательству ....

Byline может иметь несколько wordlist_mgmnt_records, поэтому определение has_many, кажется, имеет смысл.

Я не уверен, что понимаю вашу путаницу в другом направлении. Так как вы определили атрибут wordlist_mgmnt_records.byline_id, любой заданный wordlist_mgmnt_record может иметь только «иметь» (принадлежать) одну строчку. Вы просто определяете гусиную лапку через рубин (если вам нравятся диаграммы базы данных):

wordlist_msgmnt_records (many)>>----------(one) byline

Или прочитайте по-английски: «В одном подписи может быть много слов listlist_mgmnts, а многие отдельные слова в списке слов списка могут принадлежать одному заголовку».

Добавление определения own_to к модели wordlist_mgmnt не влияет на производительность запросов, просто позволяет вам делать такие вещи, как:

@record = WordlistMgmntRecord.find(8)
@record_byline = @record.byline

Кроме того, вы можете выполнять объединения в такие таблицы, как:

@records = WordlistMgmntRecord.joins(:byline).where({:byline => {:teacher_id => current_user.id}})

Который будет выполнять этот SQL:

SELECT wordlist_mgmnt_records.*
FROM wordlist_mgmnt_records
INNER JOIN bylines
  ON wordlist_mgmnt_records.byline_id = bylines.id
WHERE bylines.teacher_id = 25

(при условии current_user.id вернуло 25)

Это основано на вашем текущем дизайне БД. Если вы обнаружите, что есть способ реализовать желаемую функциональность без , имеющим byline_id в качестве внешнего ключа в таблице wordlist_mgmnt_records, то вы бы изменили свои модели, чтобы приспособить его. Однако, похоже, именно так должна выглядеть нормализованная база данных, и я не совсем уверен, каким другим способом вы бы это сделали.

...