0

例如,如果用户使用电子邮件 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

我正在使用活动来跟踪用户模型,并将它们显示在“提要”中。我想在视图中添加类似这样的内容:“用户名已加入 XYZ 网络。” 通过跟踪用户模型。

4

1 回答 1

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#createUsersController#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
于 2013-05-18T22:34:41.620 回答