Смоделируйте отношения между людьми в Ruby-on-Rails, используя has_many: through - PullRequest
2 голосов
/ 03 февраля 2010

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

Миграции:

class CreateProfiles < ActiveRecord::Migration   def self.up
    create_table :profiles do |table|
      table.column :firstName, :string
      table.column :lastName, :string
      table.column :telephone, :string
      table.column :emailAddress, :string
      table.column :location, :string
      table.timestamps
    end   end   def self.down
    drop_table :profiles   end end

class Relationship < ActiveRecord::Migration   def self.up
    create_table :relationships, :id => false do |table|
      table.column my_id :integer
      table.column your_id :integer
      table.column relationshipType :string
      table.column dateEstablished :date
      table.column notes :text
      table.timestamps      end   end   def self.down
    drop_table :relationships   end end

Модели:

class Person < ActiveRecord::Base
  has_many :relationships, :foreign_key => "my_id"
  has_many :persons :through => :relationships
end

class Relationship < ActiveRecord::Base
  belongs_to :persons
  acts_as_tree
end

Вопросы:

  1. Как правильно определить отношения между этими таблицами?
  2. Поскольку комбинация my_id / your_id уникальна, имеет ли смысл исключать: id из таблицы отношений?
  3. Есть ли более подходящие имена для полей 'my_id' и 'your_id', чтобы использовать соглашения RoR?
  4. Будут ли у меня трудности с отношением act_as_tree, если один из столбцов не имеет имя 'parent_id'?

1 Ответ

2 голосов
/ 03 февраля 2010
  1. Всего пару дней назад был задан похожий вопрос: «Отношение многие ко многим с одной и той же моделью в рельсах?» . Я пытался подробно документировать, как делать там петельные ассоциации. Возможно, это поможет вам?

  2. Таблицы без идентификаторов в Rails встречаются только с ассоциацией has_and_belongs_to_many. При обычных связях has_many :through модель таблицы соединения аналогична любой другой модели ActiveRecord и требует столбец идентификатора

  3. Я не знаю хорошего соглашения здесь, но эти примеры немного странные. Вы будете обращаться к ним как relationship.your, что лично мне немного неловко. Возможно, your_person_id, к которому можно обратиться как relationship.your_person, и дать понять, что вы имеете дело с Person экземпляром? Другой вариант может быть relationship.you.

  4. Я никогда не использовал act_as_tree, но вы можете вызвать его с помощью параметра, например, так: acts_as_tree :foreign_key => 'my_id'

Как я уже упоминал в своем ответе на другой вопрос , похоже, вашей самой большой трудностью будут двусторонние отношения. Как только человек A связан с человеком B, не подразумевается, что человек B связан с человеком A. К сожалению, это трудно сделать в ActiveRecord, насколько я могу судить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...