Rails базовая ассоциация - PullRequest
       0

Rails базовая ассоциация

0 голосов
/ 15 октября 2011

Я пытаюсь создать базовую модель ассоциации в рельсах.В основном у меня есть таблица List, в которой хранятся item_id и user_id.

Один пользователь может создать несколько «list-items».

Это правильный способ сделать это?

Спасибо.

class Item < ActiveRecord::Base
  has_many :users, :through => :lists
end

class User < ActiveRecord::Base
  has_many :items, :through => :lists
end


class List < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

Ответы [ 2 ]

1 голос
/ 15 октября 2011

В зависимости от того, чего вы хотите достичь, ваше решение будет правильным (или нет). Я вижу следующие случаи:

  1. Вы хотите создать связь n: m между элементами и пользователями. Таким образом, на каждый элемент могут ссылаться многие пользователи, а каждый пользователь ссылается на множество элементов. Если это правильный контекст, то ваше решение правильное. См. Rails Guides: Ассоциации для получения дополнительной информации об этом.
  2. Альтернативой для такой ситуации может быть использование has_and_belongs_to_many Ассоциации . Ситуация такая же, но говорить о списках не имеет смысла, для нее не будет модельного объекта.
  3. Если у каждого пользователя может быть много списков, а в каждом списке может быть много элементов, ваше решение будет неверным. Это будет не ассоциация n: m со списком в качестве таблицы соединений между ними, а два отношения 1: n.

Код для третьего примера будет выглядеть так:

class User < ActiveRecord::Base
  has_many :items, :through => :lists
  has_many :lists  
end

class List < ActiveRecord::Base
  has_many :items
  belongs_to :user
end

class Item < ActiveRecord::Base
  belongs_to :list
end

В первом решении вы должны добавить отношения для пользователей в списки и элементы в список:

class Item < ActiveRecord::Base
  has_many :lists
  has_many :users, :through => :lists
end

class User < ActiveRecord::Base
  has_many :lists
  has_many :items, :through => :lists
end
0 голосов
/ 15 октября 2011

Если сущность «список» действительно является чистой ассоциацией / объединением, то есть она не имеет собственных атрибутов, то вы можете немного упростить ее и использовать has_and_belongs_to_many. Тогда вам не нужен класс "Список".

class Item < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :items
end

Rails будет искать ссылки в таблице "items_users", поэтому при переносе вам нужно создать ее в виде:

create_table :items_users, :id => false do |t|
  t.references :users, :items
end

Многие люди скажут вам всегда использовать has_many: through, но другие (как я) не согласятся - используйте правильный инструмент для работы.

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