1

<<「ユーザーは多くのデータベースを持っていますか」という質問とも呼ばれます。>>

環境

私のアプリは次のようにモデル化されています:

user has_many databases  
database has_many tables  
table has_many rows  
row habtm(+value) columns   

あなたはアイデアを得る!

したがって、データベースでデータベースをモデル化する代わりに、次のものが必要です。

  • ユーザーを保持する sqlite3 データベースと
  • ユーザーごとに多数の sqlite データベース

各ユーザーはデータベース内のテーブルを LCRUD します (phpmyadmin と同様)。

問題

データベース接続と table_name のスレッドセーフなリクエストごとの構成が必要です

class Table < ActiveRecord::Base
end

# in some controller
# set the connection to the user-selected database from some DB list
Table.connection = current_user.session.connection
# set the name to the user-selected table from some tables list
Table.table_name = params[:table_name]
@rows = Table.all #display them

EDIT
ご覧のとおり、接続はグローバルでスレッド間で共有されますが、私のアプリの仕様によると、各ユーザーには独自の接続があります。ここで、2 人の異なるユーザーが同時に 2 つのリクエストを行ったとします。

オプション?

  • ActiveRecord をあきらめて、必要最小限の DB ドライバーを使用する
  • スレッドセーフをあきらめる
4

2 に答える 2

4

私はこれが呪文だと信じています:クラスを動的に作成するために
使用しますClass.new(AR::Base)

post_class = Class.new(ActiveRecord::Base)
post_class.connection = set_up_connection()
post_class.table_name = :posts

@posts = post_class.all
puts @posts

# note: post_class will get GC'ed at scope end just like any var, sweet!
于 2010-09-25T07:07:10.107 に答える
0

Rails は通常、リクエストごとにプロセスを設定して、すべての http リクエストが独自のプロセスで処理されるようにします。それを可能にするApacheモジュールのパッセンジャーを検索します

このような構成では、スレッドセーフの必要はありません。実際、アクティブなレコードは完全にアドセーフではありません。

于 2010-09-22T16:32:40.220 に答える