Rails 3: настройка атрибутов профиля пользователя и добавление второй модели для управления атрибутами? - PullRequest
2 голосов
/ 09 октября 2011

Я моделирую свою модель User и добавляю атрибуты профиля.

Я ищу, чтобы добавить набор социальных URL-адресов для пользователя, начиная с 3 или 4 вариантов и, возможно, увеличиваясь до более чем 15Мне было бы очень легко просто создать отдельный атрибут в модели User для каждого URL, а затем выполнить их все отдельно для страницы профиля.Хотя это может показаться избыточным, будет ли это неуместным, или я должен идти дальше, поскольку атрибуты просто хранят простую строку?

Если я не должен загружать их все в модель User:

Каков наилучший способ сделать это с отдельной моделью?Любой, как я мог бы получить все социальные URL-адреса, созданные пользователем в массиве @social_urls?

Я также хочу связать определенное эскизное изображение с каждым URL-адресом веб-сайта, который будет отображаться в блоке @ social_urls.each do.Я запутался в том, как бы динамически вызывать правильное изображение.

Большое спасибо за любую помощь или понимание.

Редактировать: будет ли это работать, чтобы прикрепить HTML-класс к социальному сайтуназвание?а затем создать эскиз с помощью css?

# In erb or (better) a helper
<% User::SOCIAL_SYSTEMS.each do |social_system| 
   url = @user.send(social_system)
   if url %>
     <p><a href="<%= url %>" class="<%=User::SOCIAL_SYSTEM_NAMES[social_system]%>"><%=
           User::SOCIAL_SYSTEM_NAMES[social_system] %></a></p>
<% end
end %>

Ответы [ 3 ]

1 голос
/ 09 октября 2011

Создание дополнительных атрибутов в пользовательской модели для независимых фактов (социальных URL) - это хорошо.

Или у вас могут быть еще две модели только для социальных URL со структурой

SocialUrl
  id
  user_id 
  social_system_id
  value

SocialSystem
  id
  name   # name of the social system ("Google +", "Facebook", etc)

Но нет необходимости в дополнительной сложности двух дополнительных таблиц, если вы действительно не видите значение.

Re:

через них всех (атрибуты социальных URL)

Вы можете (и должны) создавать вспомогательные методы для своегоПользовательская модель.Например, вы можете иметь имена социальных атрибутов в виде массива CONST, а затем использовать #send для получения всех их значений.

Добавлено Компромисс между двумя стилями (либо с использованием пользователямодель или создание двух дополнительных моделей) -

  • Как часто вы будете добавлять новые социальные системы?

С точки зрения пространства, хранение в БД настолько дешево, что оно делаетнет разницы.Т.е. стиль модели User - это более редкое хранилище данных.

  • Дополнительные две модели означают еще два контроллера, еще два набора представлений, тестирование, настройку безопасности, так что только администратор может добавлять новые социальные сети.система и т. д.

Думаю, я бы сосредоточился на основной части своего приложения и просто использовал модель User.Проще и слаще.

Добавлено Комментарии:

Для миниатюры скрепка или аналогичный способ.- Он создает дополнительную модель и таблицу, но плагин обрабатывает все детали.

Для отображения URL вы должны использовать один или два помощника.Например,

User model
  facebook_url string
  google_plus_url

# Constants defined in User model
SOCIAL_SYSTEMS = ['facebook_url', 'google_plus_url']
SOCIAL_SYSTEM_NAMES = {'facebook_url' => 'Facebook',
                       'google_plus_url' => 'Google +'}

# In erb or (better) a helper
<% User::SOCIAL_SYSTEMS.each do |social_system| 
   url = @user.send(social_system)
   if url %>
     <p><a href="<%= url %>"><%=
           User::SOCIAL_SYSTEM_NAMES[social_system] %></a></p>
<% end
end %>

Добавлено ps Если вам нужно сохранить более одного факта для каждой социальной системы (например, URL-адрес для профиля из социальной системы плюс последний балл человека из социальной системы)тогда я бы пошел на дополнительные таблицы.Но если вам нужен только один факт (например, URL профиля человека), тогда добавление в модель пользователя подойдет.(Имхо)

1 голос
/ 09 октября 2011

Вам действительно нужна дополнительная модель для этого?

если вам нужно хранить растущее количество URL-адресов для сайтов социальных сетей или других веб-сайтов, вы можете сделать следующее:

1) определить миграцию для добавления текстового столбца :social_sites в вашу модель пользователя

class AddSorialSitesToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :social_sites, :text
  end

  def self.down
    remove_column :users, :social_sites
  end
end

2) определить атрибут: social_sites для сериализации

class User < ActiveRecord::Base
   serialize :social_sites

end

3) Затем присвойте Hash или OrderedHash значение user.social_sites и сохраните запись.

u = User.find(1)
u.social_sites = {:facebook => 'http://facebook.com/somebody', :twitter => "http://twitter.com/somebody", ...}

, поскольку это Hash, вы можете назначить столько разных имен Service в качестве ключей, сколько захотите ... а затем итерировать ключи Hash, чтобы получить их ... или напрямую обращаться к ним по имени сайта. например:

u = User.find(1)
puts u.social_sites[:facebook]
puts u.social_sites[:twitter]
...

Улучшение:

Если вы хотите хранить больше, чем просто URL для каждого сайта, вы можете использовать вложенные хэши следующим образом:

u.social_sites = {:facebook => {:url => "http://facebook.com/username", :icon => "url-or-filename-to-the-icon"} ,
                  :twitter =>  {:url => "http://twitter.com/username",  :icon => "url-or-filename-to-the-icon"}
                 }

Rails будет сериализовать Hash (ы) в единый атрибут: social_sites, и когда вы получите к нему доступ, он будет десериализован - вы можете просто получить к нему доступ, как и любой другой Hash

   u = User.find(1)
   puts u.social_sites[:facebook][:url]
    => "http://facebook.com/username"

   puts u.social_sites[:facebook][:icon]
    => "url-or-filename-to-the-icon"

надеюсь, это поможет

1 голос
/ 09 октября 2011

Вы, вероятно, хотите иметь одну модель для хранения URL-адресов для каждого пользователя, а затем другую модель для управления миниатюрами для каждого сайта. если вам не нужны персональные значки для каждого пользователя, в этом случае вы, вероятно, включите has_attached_file в модель User, а не в модель SocialSite. paperclip - это преобладающий драгоценный камень вложения для рельсов, отсюда и появился метод has_attached_file.

class User < ActiveRecord::Base
  has_many :social_urls
end

class SocialUrl < ActiveRecord::Base
  belongs_to :user
  belongs_to :social_site
end

class SocialSite < ActiveRecord::Base
  has_attached_file :thumbnail
  has_many :social_urls
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...