2011-10-09 53 views
2

我造型我的用戶模型和添加的資料特徵。的Rails 3:設置用戶配置文件的屬性,並增加管理屬性的第二個模型?

我期待添加一組社會網址的用戶,從約3或4個選項,並有可能增長到超過15個這將是非常容易的,我只是創建了一個用戶單獨的屬性爲每個網址建立模型,然後針對個人資料頁面單獨運行所有網址。雖然這看起來可能是多餘的,這是不恰當的還是我應該繼續前進,因爲屬性只是存儲一個簡單的字符串?

如果我不應該他們都加載到用戶模式:

什麼會去了解一個單獨的模型做這個的最好方法?任何我如何能夠抓住用戶在@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 %> 
+0

請記住,注意所有您認爲有用的答案,包括回答其他人提出的問題。 –

回答

1

在用戶模型上爲獨立事實(社交網站)創建附加屬性是好的。

或者你可以有另外兩個車型只爲與結構

SocialUrl 
    id 
    user_id 
    social_system_id 
    value 

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

社會網址,但無需對兩個額外的表,除非你真的看到一個值的額外的複雜性。

回覆:

橫貫其中全部(社會URL屬性)

你可以(也應該)爲您的用戶模型的輔助方法。例如,您可以將社交屬性的名稱作爲CONST數組,然後使用#send檢索所有值。

新增兩種風格之間的權衡(使用用戶模式或創建兩個額外的型號) -

  • 多久你會增加新的社會制度?

在空間方面,db存儲非常便宜,沒有什麼區別。 - 即用戶模型風格是稀疏的數據存儲。

  • 額外的兩款車型意味着兩個控制器,兩個組的意見,測試,安全配置,以便只有管理員可以添加一個新的社會制度等

我想我會專注於我的應用程序的主要部分,只是使用用戶模型。更簡單,更甜美。

新增回覆意見:

對於縮略圖,回形針或類似的是要走的路。 - 它確實創建了一個額外的模型和表格,但該插件處理所有細節。

爲了顯示網址,您需要使用一個或兩個助手。例如

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 如果需要存儲每個社會制度不止一個事實(例如,從社會制度以及人的從社會制度中的最新得分的個人資料網址),那麼我會去爲額外的表格。但是,如果您只需要一個事實(例如該用戶的個人資料網址),那麼添加到用戶模型就沒有問題。 (imho)

+0

感謝您的洞察力,我喜歡簡單的路線去用戶模型,並堅持到我的應用程序的辛勤工作但是我怎麼會得到一個縮略圖附加到視圖?並在配置文件視圖中,我必須做一個除非@ user.facebook_url.empty?爲每一個(也許12)社交網絡? –

+0

根據您的意見更新答案 –

+0

非常感謝!有沒有辦法讓SOCIAL_SYSTEM_NAMES適應縮略圖? –

1

你可能想要有一個模型來存儲每個用戶的url,然後是另一個模型來管理每個站點的縮略圖。除非你想爲每個用戶設置個人圖標,在這種情況下,你可能會在用戶模型中包含has_attached_file而不是製作一個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 
+0

我同意使用回形針或類似的方法來存儲縮略圖。或者只是使用Gravatar –

+0

我實際上在我的應用中使用carrierwave,是否有解決方法?你也可以分解SocialUrl,SocialSite和User模型的屬性嗎?並解釋我將添加到配置文件視圖,以查看圖標?非常感謝。 –

+0

這個railscast可能會幫助:http://railscasts.com/episodes/253-carrierwave-file-uploads –

1

你真的需要一個額外的模型嗎?

,如果你要存儲社交網站或其他web站點越來越多的網址,你可以做到以下幾點:

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)然後分配一個哈希或OrderedHash到user.social_sites並保存該記錄..

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

,因爲它是一個Hash,只要你喜歡,你可以將許多不同的服務名稱作爲鍵..和然後稍後遍歷Hash鍵以檢索它們或者直接使用站點名稱訪問它們例如:

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

增強:

如果你想存儲的不僅僅是網址爲每個站點較多,可以按如下方式使用嵌套的哈希值:

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會序列化哈希(es)轉換爲單一屬性:social_sites,並且當您訪問它時,它將會反序列化它 - 您可以像訪問其他任何哈希一樣訪問該屬性

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" 

希望這會有所幫助

+0

嗨,我很困惑我將如何設置表單,讓用戶最初爲每個可能的social_site存儲url,以及如何在視圖中鏈接到url,方法是顯示社交網站的圖標圖像 –

+0

您可以編碼你自己作爲用戶視圖的一部分..例如與部分 – Tilo

+0

抱歉,我的意思是,我不明白我將如何編碼該部分。我是新來的軌道和編程.. –