Rails: has_many через ассоциацию - я правильно понял? - PullRequest
3 голосов
/ 20 сентября 2011

Я создаю веб-приложение для обмена фотографиями с использованием Rails 3.1. Я просто хочу убедиться, что я правильно понял ассоциации.

Некоторый контекст: A User имеет много Share. A Share имеет один User (то есть " sharer "), один Photo и много Receiver. A Receiver является произвольным User.

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

class Photo < ActiveRecord::Base
  has_many :shares
end

class Receiver < ActiveRecord::Base
  belongs_to :share
  belongs_to :user
end

class Share < ActiveRecord::Base
  belongs_to :photo
  belongs_to :user
  has_many :receivers
  has_many :users, :through => :receivers
end

class User < ActiveRecord::Base
  has_many :receivers
  has_many :shares, :through => :receivers
end

Получение User общих фотографий может быть выполнено с использованием метода shares class?

User.first.shares
# => [<#Share:0x000>, ...]

Получение User полученных акций может быть затем выполнено с использованием метода класса receivers?

User.first.receivers
# => [<#Receiver:0x000>, ...]

Правильно ли я понял?

1 Ответ

0 голосов
/ 21 сентября 2011

Некоторое время назад я делал нечто подобное, я не тестировал этот код, поэтому поэкспериментируйте с ним и посмотрите, действительно ли он вам нужен, хотя он может указать вам верное направление.

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

class User < ActiveRecord::Base
  has_many :shares_links, :class_name => "Share", :foreign_key => :sharing_id, :dependent => :destroy
  has_many :receiver_links, :class_name => "Share", :foreign_key => :shared_to_id, :dependent => :destroy

  has_many :shares, :through => :shares_links
  has_many :receivers, :through => :receiver_links
end

class Share < ActiveRecord::Base
  belongs_to :sharing, :validate => true, :class_name => "User", :foreign_key => :sharing_id 
  belongs_to :shared_to, :validate => true, :class_name => "User", :foreign_key => :shared_to_id

  has_one :photo
end

class Photo < ActiveRecord::Base
  belongs_to :photo
end

User.first.shares
User.first.receivers
User.first.receivers.first.photo
...