Фильтрация фида микросообщений по профилю пользователя

На нашем сайте у нас есть страница профиля пользователя, на которой мы хотим отображать все микросообщения, относящиеся к профилю этого пользователя.

В нашей таблице микросообщений у нас есть столбец own_to_id и user_id (определяет, от кого отправлено микросообщение).

Мы пытаемся сопоставить own_to_id с user_id. Это делается для того, чтобы при просмотре профиля отображались только микросообщения, в которых author_to_id совпадает с user_id просматриваемого профиля. Как мы могли это сделать?

class Micropost < ActiveRecord::Base
  attr_accessible :content, :belongs_to_id

  belongs_to :user


  validates :content, :presence => true, :length => { :maximum => 240 }
  validates :user_id, :presence => true

  default_scope :order => 'microposts.created_at DESC'

    # Return microposts from the users being followed by the given user.
    scope :from_users_followed_by, lambda { |user| followed_by(user) }

    private

      # Return an SQL condition for users followed by the given user.
      # We include the user's own id as well.
      def self.followed_by(user)
        following_ids = %(SELECT followed_id FROM relationships
                      WHERE follower_id = :user_id)
        where("user_id IN (#{following_ids}) OR user_id = :user_id",
          { :user_id => user })
    end
  end

Контроллер пользователей:

class UsersController < ApplicationController
  before_filter :authenticate, :only => [:index, :edit, :update, :destroy]
  before_filter :correct_user, :only => [:edit, :update]
  before_filter :admin_user,   :only => :destroy

      def index
         @title = "All users"
         @users = User.paginate(:page => params[:page])
      end

      def show

          @user = User.find(params[:id])
          @microposts = @user.microposts.paginate(:page => params[:page])
          @title = @user.name
          @micropost  = current_user.microposts.build(params[:micropost])
      end

person scud bomb    schedule 04.02.2012    source источник


Ответы (2)


Вот подход с именованной областью действия в классе MicroPost, только если вы хотите, чтобы сообщения, в которых user_id Иmember_to были одинаковыми:

микропост.рб

class MicroPost < ActiveRecord::Base
  scope :relevant_to_user, lambda{|i|
   where("user_id = ? AND belongs_to_id = ?", i, i)}
end

затем в контроллере:

def show
  @user = User.find(params[:id])
  @microposts = MicroPost.relevant_to_user(@user.id)
end

РЕДАКТИРОВАТЬ: Если вам нужно только найти микросообщения, где own_to_id соответствует значению (в данном случае current_user.id), используйте:

def show
  @microposts = MicroPost.where(:belongs_to_id=>current_user.id)
end
person miked    schedule 04.02.2012
comment
@scudbomb - Нет проблем, рад помочь. Важно: чтобы любой из ваших будущих вопросов привлек внимание, это поможет нам обоим, если вы проголосуете за этот ответ и отметите его как принятый. Спасибо! - person miked; 04.02.2012
comment
Я очень новичок в переполнении стека, рельсах и кодировании в целом. Похоже, я не могу проголосовать, пока не наберу 15 репутации. Как добраться быстрее? - person scud bomb; 04.02.2012
comment
@scudbomb ах, да, я забыл об этом требовании голосовать. Не беспокойтесь об этом. Ваша репутация будет расти, если вы будете задавать хорошие вопросы (и отвечать на них). Удачи! -мд - person miked; 04.02.2012
comment
только что понял, что код не работает, он показывает только микросообщения, в которых совпадают user_id и belongs_to_id сообщения. Мы хотим отображать только сообщения, в которых belongs_to_id сообщения соответствует user_id текущего пользователя. Я знаю, что это сложно, но мы действительно пытаемся оптимизировать эти каналы, и у нас это получается с трудом. - person scud bomb; 05.02.2012
comment
Хорошо. Извините, я совершенно неправильно понял ваш вопрос. Если это так, то это намного проще и будет таким же, как ответ Alex D ниже: Micropost.where(:belongs_to_id=›current_user.id). Я обновлю вышеизложенное. - person miked; 05.02.2012
comment
отлично, мы запускаем его прямо сейчас. Какой у тебя адрес электронной почты? не стесняйтесь написать мне в DM через Twitter (at)its_scutti или на мой адрес электронной почты [email protected] - person scud bomb; 05.02.2012

Я не понимаю, почему в микросообщениях есть оба belongs_to_id и user_id. Но если вы хотите найти все микросообщения, belongs_to_id которых соответствует данному идентификатору пользователя, все, что вам нужно, это:

@microposts = Micropost.find_all_by_belongs_to_id(@user.id)
person Alex D    schedule 04.02.2012
comment
Надеюсь, это было полезно! Если это решило вашу проблему, пожалуйста, примите (также приветствуется голосование). - person Alex D; 04.02.2012
comment
Я новичок в переполнении стека и кодировании, и кажется, что я не могу голосовать, пока не достигну 15 репутации. - person scud bomb; 04.02.2012
comment
Я только что проголосовал за ваш вопрос, это должно дать вам необходимую репутацию. - person Alex D; 04.02.2012