Разъяснение рельсовых ассоциаций - PullRequest
0 голосов
/ 22 марта 2011

У меня есть базовая система отслеживания запасов. Каждый пользователь может создать элемент с необязательным местоположением , чтобы:

class User < ActiveRecord::Base
  ...
  has_many :items, :dependent => :destroy
  has_many :locations, :dependent => :destroy
end

class Item < ActiveRecord::Base
  ...
  validates :user_id, :presence => true
  belongs_to :user
  has_one :location
end

class Location < ActiveRecord::Base
  ...
  validates :user_id, :presence => true
  belongs_to :user
  has_many :items
end

Я не могу понять, кто кому принадлежит! Я знаю, что каждый предмет и место должно принадлежать Пользователю. Я также хочу ассоциацию, чтобы каждый элемент мог иметь одно местоположение, но я не знаю, должно ли это быть через пользователя. Имею ли я смысл?

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

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Если вы не делаете что-то, где у пользователя будет определенное местоположение, это должно быть тем, что вам нужно.

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

class Item < ActiveRecord::Base
  belongs_to :user
  belongs_to :location
end

class Location < ActiveRecord::Base
  has_many :items
  has_one :user, :through => :items  # Only if you want `Location#user` methods
end

Элемент belongs_to пользователя - это то, о чем мы можем договориться.Элемент также belongs_to местоположение, потому что мы просто хотим, чтобы внешний ключ модели изделия был таким, чтобы множество элементов могло быть связано с одним и тем же местоположением.

Возможно, вы не хотите, чтобы местоположения былиспецифичные для пользователя, поэтому нет дополнительной has_one :user ассоциации в модели местоположения.

0 голосов
/ 22 марта 2011

Представьте принадлежность_ как способ указания внешнего ключа.

Кроме этого, думай на естественном языке.

A user has an inventory
An inventory has items
An item has a location
A user has items through inventory
A user has locations through items(possibly, if you want that)

Ассоциации - это просто способ получить такие средства, как user.inventory.items или user.locations:)

EDIT

Местоположение пользователя является ассоциацией многих ко многим. Это означает, что вам нужна третья таблица user_locations, которая принадлежит пользователю и местоположению. Это если местоположение не принадлежит только одному пользователю. В противном случае, если два пользователя и более могут иметь одно и то же местоположение, вам понадобится модель through user_locations.

...