два ресурса с двумя разными отношениями в рельсах

Я новичок в рельсах, и у меня возникла ситуация, в которой я не совсем понимаю.

Допустим, у меня есть два ресурса: пользователи и виджеты.

Пользователи могут использовать виджеты, но виджеты также создаются пользователями и должны принадлежать создавшему их пользователю. Должен быть пользователь, использующий виджет, и пользователь владеет виджетом. Я ищу следующее?

Class User < ActiveRecord::Base
  has_many :uses
  has_many :widgets, :through => :uses
  has_many :owns
  has_many :widgets, :through => :owns
end

Class Widget < ActiveRecord::Base
  has_one :own
  has_many :uses
  has_many :users, :through => :uses
end

Class Use < ActiveRecord::Base
  belongs_to :user
  belongs_to :widget
end

Class Own < ActiveRecord::Base
  belongs_to :user
  belongs_to :widget
end

person re5et    schedule 15.07.2010    source источник


Ответы (1)


Я бы сделал немного иначе.

Class User < ActiveRecord::Base
  has_many :uses
  has_many :widgets, :through => :uses
  has_many :owned_widgets, :class_name => "Widget"
end

Class Widget < ActiveRecord::Base
  belongs_to :owner, :class_name => "User"
  has_many :uses
  has_many :users, :through => :uses
end

Class Use < ActiveRecord::Base
  belongs_to :user
  belongs_to :widget
end

Я немного изменил имена, у вас был конфликт имен на widget, у вас не может быть двух ассоциаций с одним и тем же именем. Я также удалил has_one и просто установил owner, который будет иметь внешний_ключ owner_id с классом, установленным на User. Кроме того, вы прекрасно установили отношения «многие ко многим».

person Geoff Lanotte    schedule 15.07.2010
comment
я подумал, что не могу назвать ассоциации одинаковыми, но не знал об этом маленьком достоинстве class_name. попробую. - person re5et; 15.07.2010