我正在做一些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”吗?
答案 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
如果符合预期的行为,请尝试上述关联。