Как сделать части профиля доступными для поиска или нет

#ruby-on-rails-3

#ruby-on-rails-3

Вопрос:

В моем приложении Rails 3 я хочу разрешить пользователю указывать, какие части его профиля могут быть доступны для поиска другими. Я знаю, как это сделать, если бы я хотел сделать всего пользователя невидимым, но как я могу настроить его так, чтобы несколько полей можно было назначать для поиска или нет отдельно?

Подробная информация:

С точки зрения функциональности я хочу ограничить поиск в зависимости от того, какие части своего профиля пользователь выбирает для поиска /settings . Части профиля будут, например, @user.profile.hometown или @user.profile.current_city . Я работаю над комбинацией Railscasts # 52 и учебника Тревора Терка, чтобы установить, что другие могут искать с помощью флажков в настройках.

Когда в настройках задана возможность поиска, когда пользователь выполняет поиск (или фильтрует) по /users индексу, то, что не скрыто, будет общедоступным и доступным для поиска. С точки зрения того, как это работает в БД, что касается скрытия столбцов таблицы или группировки, я думал о скрытии таблиц, но, возможно, это не лучшее решение. Я настолько новичок, насколько это возможно, и, честно говоря, не особо задумывался об этом.

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

1. Информация добавлена к вопросу! Сейчас я удалю свои комментарии.

Ответ №1:

Метод 1 — показать / скрыть определенные столбцы

Итак, самый прямой способ (и это сработает, если вы хотите показать / скрыть только несколько вещей) — это просто создать логический столбец для каждой вещи, которую вам нужно показать / скрыть. Итак, если у вас есть поле с номером телефона, у вас может быть столбец с именем «show_phone_number», и при значении true он будет отображаться.

Метод 2 — показывать / скрывать целые разделы

Следующий уровень, который вам может понадобиться, это вместо отображения / скрытия определенных столбцов отображать / скрывать логические столбцы, например show_contact_info , show_photos , и т.д. для каждого логического раздела, который пользователь будет показывать или скрывать.

Тогда, на ваш взгляд, у вас будет что-то вроде:

app/views/user/show.html.erb (или .haml или что бы вы ни использовали)

 ....
<% if @user.show_contact_info %>
  <%= render :partial => "user_contact_info", :locals => {:user => @user} %>
<% end %>
 

app/views/partials/_user_contact_info.html.erb

 <%=h user.email %><br />
<%=h user.phone_number %><br />
<%=  user.blog_url %><br />
...
 

Метод 3 — показывать / скрывать разделы в зависимости от того, кто их просматривает

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

  • Видимость разделов (кто может просматривать какие разделы)
  • Роли (друзья, подписчики, общедоступные, личные)
  • несколько методов, позволяющих сделать эти отношения понятными / понятными

Итак, в вашей User модели у вас будет что-то вроде:

 class User < ActiveRecord::Base
  has_many :friends, :through => "friendships"  # or whatever construct you have
  has_many :followers, :through => "followings" # or whatever construct you have
  has_many :profile_visibilities
  ...

  def is_friends_with(user)
    friends.include?(user)
  end

  def is_a_follower_of(user)
    user.followers.include?(self)
  end

  def can_see(visibilities)
    visibilities.each do |v|
      v.user == self || v.is_public || can_see_because_we_are_friends(v) || can_see_because_i_follow(v)
    end
  end

  private:
  def can_see_because_we_are_friends(visibility)
    visibility.is_friend amp;amp; is_friends_with(visibility.user)
  end

  def can_see_because_i_follow(visibility)
    visibility.is_follower amp;amp; is_follower_of(visibility.user)
  end
end
 

Затем класс называется ProfileVisibilities :

 class  ProfileVisibilities < ActiveRecord::Base
  belongs_to :user
  ...

  def is_public
    visibility == "public"
  end

  def is_friend
    visibility == "friends"
  end

  def is_follower
    visibility == "followers"

  def is_private
    !is_public amp;amp; !is_friend amp;amp; !is_follower
  end
end
 

Затем таблица называется profile_visibilities

 id  | user_id | profile_section | visibility
----------------------------------------------
1   | 1       | contact_info    | public        # <= visible to everyone
2   | 1       | personal_info   | friends       # <= visible only to "friends"
3   | 1       | blog_posts      | friends       # <= visible to "friends"
4   | 1       | blog_posts      | followers     # <= ...and followers
5   | 1       | photos          | friends       # <= visible only to "friends"
 

Затем в вашем контроллере что-то вроде:

app/controllers/users_controller.rb

 ...
def show
  @user = User.find(params[:id])
  @contact_info_visibilities = ProfileVisibilities.find(:all, :conditions = ['user_id = ? AND profile_section = "contact_info"', @user.id]
  @photo_visibilities = ProfileVisibilities.find(:all, :conditions = ['user_id = ? AND profile_section = "photos"', @user.id]
  # ... and more for each section visibility you need
end
...
 

И на ваш взгляд:

app/views/user/show.html.erb

 ...
<% if current_user.can_see(@contact_info_visibilities) %>
  <%= render :partial => "user_contact_info", :locals => {:user => @user}
<% end %>

<% if current_user.can_see(@photo_visibilities) %>
  <%= render :partial => "user_photos", :locals => {:user => @user}
<% end %>
...
 

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

1. Вау, нагрузки для переваривания. Большое спасибо!