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
780   4  

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

    Ничего не найдено.