0

たとえば、ユーザーが電子メール johndoe@xyz.com を使用してサインアップした場合、このユーザーを Web サイトの「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#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
于 2013-05-18T22:34:41.620 に答える