例如,如果用户使用电子邮件johndoe@xyz.com注册,我希望此用户成为我网站上“XYZ”网络的一部分。人们将被允许加入他们各自的网络。我的网站上会有很多网络,它们彼此是分开的。这是用户表在schema.db中的外观。
create_table "activities", :force => true do |t|
t.integer "trackable_id"
t.string "trackable_type"
t.integer "owner_id"
t.string "owner_type"
t.string "key"
t.text "parameters"
t.integer "recipient_id"
t.string "recipient_type"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
add_index "activities", ["owner_id", "owner_type"], :name => "index_activities_on_owner_id_and_owner_type"
add_index "activities", ["recipient_id", "recipient_type"], :name => "index_activities_on_recipient_id_and_recipient_type"
add_index "activities", ["trackable_id", "trackable_type"], :name => "index_activities_on_trackable_id_and_trackable_type"
create_table "users", :force => true do |t|
t.string "name"
t.string "email"
t.timestamp "created_at", :null => false
t.timestamp "updated_at", :null => false
t.string "password_digest"
t.string "remember_token"
t.boolean "admin", :default => false
end
我正在使用活动来跟踪用户模型,并将其显示在“Feed”中。我想在视图中添加这样的内容:“用户名已加入XYZ网络。”通过跟踪用户模型。
答案 0 :(得分:0)
创建Network
模型。它的数据库表将包含一个名为domain
的字符串。一个网络将拥有许多用户;用户将属于网络。也可以在用户模型中添加network_id
字符串。
关联和支持方法应如下所示:
class Network < ActiveRecord::Base
has_many :users
def peers
self.users
end
end
class User < ActiveRecord::Base
belongs_to :network
delegate :peers => :network
validates :network_id, :presence => true
# ...
end
现在这是可能的:
@network.users
# => collection of all users in a network
@user.network
# => the network user belongs to
@user.peers
# => collection of all users within @user's network
# => note: this will include @user itself in the collection
当用户注册时,创建或查找包含从用户电子邮件地址中提取的域字符串的Network
记录。当用户更新其电子邮件地址时,请检查域是否已更改,然后重新创建或重新查找具有匹配域的Network
记录。
在模型中自动执行此功能很有吸引力,但在控制器中正确实现,特别是UsersController#create
和UsersController#update
。
def create
# ...isntantiate @user...
#
set_network_id_from_email(@user.email)
#
# ...save...
end
def update
# ...instantiate @user...
#
if @user.email != params[:user][:email]
set_network_id_from_email(params[:user][:email])
end
#
# ...update_attributes...
end
private
def set_network_id_from_email(addr)
if email = Mail::Address.new(addr)
@user.network_id = Network.find_or_create_by_domain(email.domain)
end
end