可以通过关联将其重写为has_many吗?

时间:2019-07-12 23:08:42

标签: ruby-on-rails

我正在做一些Rails关联练习,并且有以下关联

    #tests.py
    def test_clean_number_of_students_smaller_than_max_students_number(self):
        '''Check if number of students is not bigger than maximum number'''
        self.course_0.max_number_of_students = 5
        self.course_0.save()
        users = UserFactory.create_batch(10)
        form = ClassOccurrenceForm(
            {'students':[*users], 'course': self.course_0.pk}, 
            instance=self.class_occurrence_0
        )
        self.assertEqual(form.errors, 
            {'students': ["Too many students!"]})

上面的方式对我来说很有意义。我想得到以下内容:

class User
   has_many :videos
end

class Video
   has_many :comments
   belongs_to :user
end

class Comment
  belongs_to :user
  belongs_to :video
end

这对我来说似乎可以接受,但是有一些事情告诉我,这可能会更好。是否存在潜在的user1 = User.find(1) user1.videos #A user's associated videos user1.comments #A user's associated comments user1.videos.first.includes(:comments) #A particular user video's comments 关联,例如“用户通过视频有很多评论?”我认为这不是正确的关联,因为评论不能通过视频吸引到很多用户。我可以使用只能通过一个方向的“ has_many:through”吗?

2 个答案:

答案 0 :(得分:5)

首先,您缺少class User has_many :videos has_many :comments end class Video has_many :comments belongs_to :user end class Comment belongs_to :user belongs_to :video end

user.comments.where( video: video )

如果您想找到特定用户对特定视频的评论...

video.comments.where( user: user )

反之亦然。

User.has_many :videos

请注意,user.videos有点奇怪。用户除了评论视频之外,还拥有视频吗?我认为可能class User has_many :comments has_many :commented_videos, through: :comments, class_name: "Video" end 是用户评论过的视频。在这种情况下...

videos = user.commented_videos

现在您可以获取用户评论过的视频。

:videos

请注意,我避免将这个关联称为简单的{{1}},以使它们明确是用户评论过的视频,而不是用户的视频。

答案 1 :(得分:1)

class User
   has_many :videos
   has_many :comments, through: :videos
end

class Video
   has_many :comments
   belongs_to :user
end

class Comment
  belongs_to :video
end

如果符合预期的行为,请尝试上述关联。