Ruby on Rails получить все комментарии
У меня есть (полиморфный) объект Comment (который будет использоваться для объектов Vehicle и Review). Как я могу получить все comments для User s Vehicles: @user.vehicles.comments? Он говорит, что метод comments Не определен для ActiveRecord::Relation. Есть какой-нибудь простой способ заставить его работать? Это отношение многих ко многим: многие транспортные средства имеют много комментариев? Или я ошибаюсь? @user.vehicles.first.comments работает правильно.
Отношения между объектами (не полные):
User
has_many Vehicles.
Vehicle
belongs_to User.
has_many Comments (as commentable).
Comment
belongs_to Commentable, :polymorphic => true
4 ответов:
Часть комментариев просто прекрасна. Дело в том, что вы звоните:
@user.vehicles.commentsЗдесь транспортные средства - это объект отношений AR, который ничего не знает о комментариях. т. е. - @пользователей.транспортные средства-это набор транспортных средств для этого пользователя.
Чтобы получить все комментарии по транспортным средствам, связанным с пользователем, вы можете сделать следующее:
@user.vehicles.to_a.collect{|v| v.comments.to_a }.flatten, который вернет массив всех комментариев к любому из транспортных средств пользователя.
Попробуйте это:
Запишите это в user.РБ:
has_many :comments, :through => :vehiclesТеперь
@user.commentsОн будет получать все комментарии, созданные для ваших транспортных средств
Вы также можете получить комментарии через:
Но это, на мой взгляд, не совсем правильный путь.@user.vehicles(:include => :comments).collect{|v| v.comments}.flatten
Я думаю, что вы пытаетесь сделать сложную ассоциацию или, возможно, вы неправильно понимаете полиморфную ассоциацию. Это проще, чем вы думаете. Вот ассоциация, которую вы должны определить:
User has_many vehicles Vehicle belongs_to user has_many comments, as: :commentable Comment belongs_to :commentable, polymorphic: trueЧтобы получить все комментарии транспортного средства вашего пользователя, вы можете определить ассоциацию
has_many :throughв пользовательской модели:User has_many vehicles has_many comments, through: :vehiclesТеперь вы можете использовать
@user.comments, чтобы получить все комментарии о транспортных средствах пользователя.
Попробуйте вот это :
В пользовательской модели добавить:
has_many :comments, :through => :vehiclesПравка для автомобиля и отзывов:
В пользовательской модели:
has_many :comments, :through => :vehicles, :as => :comments_vehicles has_many :comments, :through => :reviews, :as => :comments_reviews def comments self.comments_vehicles + self.comments_reviews end
Comments