Как я могу настроить условие `has_many` в этой ситуации?

#ruby-on-rails #ruby-on-rails-3 #activerecord #ruby-on-rails-4

#ruby-on-rails #ruby-on-rails-3 #activerecord #ruby-on-rails-4

Вопрос:

Пользователь — last_active_at (последний вход вовремя)

Сообщество -идентификатор пользователя

Код -идентификатор пользователя -идентификатор сообщества

  1. Сообщества и коды пользователя has_many
  2. Сообщество принадлежит пользователю, коды has_many
  3. Код принадлежит пользователю и сообществу

модели/user.rb

 has_many :communities
has_many :codes, :dependent => :destroy
  

модели/community.rb

 belongs_to :user, counter_cache: true
has_many :codes 
  

модели/code.rb

 belongs_to :user, counter_cache: true
belongs_to :community, counter_cache: true
  

Я могу получить все сообщества, написав подобное кодирование с помощью драгоценного камня под названием ‘acts_as_votable’ (https://github.com/ryanto/acts_as_votable)

 @communities = current_user.get_up_voted(Community)
  

Затем я пытаюсь получить все коды из этих all @communities.

 @codes = Code.includes(:user).where(:community_id => @communities.collect(amp;:id)).order('created_at DESC').page(params[:page]).per(10)
  

Но я хочу отсортировать его по last_active_at столбцу пользовательской таблицы.
Итак, я попробовал это ниже

 @codes = Code.includes(:user).where(:community_id => @communities.collect(amp;:id)).order("users.last_active_at DESC").page(params[:page]).per(10)
  

Но загрузка занимает целую вечность.

Вероятно, лучшее решение — создать has_many условие между сообществом и пользователем с помощью кода? Тогда это должно быть что-то вроде этого.

 @codes = @communities.code_group.include(:users).order("users.last_active_at DESC").page(params[:page]).per(10)
  

Как я могу изменить свой код?

Ответ №1:

Я считаю, что вам нужно изменить has_many в User модели на has_many codes, through: :communities . Тогда Code следует только belongs_to :community . Это если Users ‘s не может иметь Codes без Code связи с Community

Комментарии:

1. что делать, если пользователь не имеет доступа к сообществу, но у него есть код для этого сообщества?

2. Под «не принадлежит» вы имеете в виду, что в базе данных нет записи для этой комбинации пользователя / сообщества?

3. нет. Пользователь может принадлежать сообществам, и это обрабатывается с помощью драгоценного камня под названием «acts_as_votable», как я указал в своем вопросе. Таким образом, он полностью отделен от таблицы кода.