Как определить отношения ActiveRecord между двумя моделями, которые связаны друг с другом двумя различными способами? - PullRequest
1 голос
/ 06 октября 2009

В моем приложении есть классы Пользователь, Видео и Голосование. Пользователи и видео могут относиться друг к другу двумя способами: как один ко многим или как многие ко многим. Первый - когда пользователь отправляет видео (один пользователь может отправить много видео). Последнее происходит, когда пользователь голосует за видео (у пользователей есть много видео с помощью голосов, и наоборот). Вот мой код, который не работает (я думаю - я могу делать что-то не так в представлении). Пожалуйста, помогите мне понять, как правильно структурировать эти ассоциации:

class User < ActiveRecord::Base
  has_many :videos, :as => :submissions
  has_many :votes #have tried it without this
  has_many :videos, :as => :likes,  :through => :votes
end

class Vote < ActiveRecord::Base
  belongs_to :video
  belongs_to :user
end

class Video < ActiveRecord::Base
  belongs_to :user
  has_many :votes #have tried it without this . . . superfluous?
  has_many :users, :as => :voters, :through => :votes
end

Ответы [ 3 ]

2 голосов
/ 06 октября 2009

Я не пошел и не проверил, но это выглядит примерно так:

Вместо

has_many :videos, :as => :likes, :through => :votes

Используйте

has_many :likes, :class_name => "Video", :through => :votes

То же самое с дном:

has_many :users, :as => :voters, :through => :votes

становится

has_many :voters, :class_name => "User", :through => :votes

:as используется для полиморфных ассоциаций. См. эту главу в документах для получения дополнительной информации.

1 голос
/ 06 октября 2009

Спасибо за вашу помощь, ребята, определенно указали мне в правильном направлении. Вот рабочий код:

class User < ActiveRecord::Base
  has_many :videos, :as => :submissions
  has_many :votes
  has_many :likes, :source => :video, :through => :votes 
end

class Vote < ActiveRecord::Base
  belongs_to :video
  belongs_to :user
end

class Video < ActiveRecord::Base
  belongs_to :user
  has_many :votes
  has_many :voters, :source => :user, :through => :votes 
end

PS Я сохранил это как: лайки, потому что в этом приложении они не смогут понижать голос, только повышают голос.

1 голос
/ 06 октября 2009
class User < ActiveRecord::Base
  has_many :videos # Submitted videos
  has_many :votes
  has_many :voted_videos, :through => :votes # User may vote down a vid, so it's not right to call 'likes'
end

class Vote < ActiveRecord::Base
  belongs_to :video
  belongs_to :user
end

class Video < ActiveRecord::Base
  belongs_to :user
  has_many :votes
  has_many :voters, :through => :votes
end

Более подробную информацию можно найти здесь: http://guides.rubyonrails.org/association_basics.html

Надеюсь, это поможет =)

...