0

わかりました、この db スキーマ (リレーション) があるとします:

|User    | (1-->n) |Customer | (1-->n) |Car  | (1-->n) |Support    |
|--------|         |---------|         |-----|         |-----------|
|id      |         | user_id |         |Brand|         |Description|
|username|         |lastname |         |PS   |         |Cost       |
|password|         |firstname|         |seats|         |hours      |
|...     |         |..       |         |...  |         |...        |

テーブル User は Authlogic によって生成されます。

私には2人の登録ユーザーがいて、それぞれに顧客がいます。Authlogic を使用すると、認証されたユーザーのみがコントローラー/ビューにアクセスできるようになります。それは問題ありません。それが Authlogic の目的です。

ここで、user#1 が user#2 の顧客に属する情報にアクセスしないようにする必要があります。

つまり、ユーザー #1 がhttp://myapp.com/carsにアクセスすると、ユーザー #1 の顧客に属する車のリストが表示されます。

id=131 の車が user#1 の顧客に属している場合、user#1 だけがこの情報 ( http://myapp.com/car/1 ) にアクセスできる必要があります。ユーザー#2 がブラウザに同じリンクを挿入した場合、この情報を見ることができる必要はありません。

レコードが current_user に関連付けられているかどうかを確認するために、ユーザーと各 db テーブルの間に関係を作成することを提案する人もいました。

どう思いますか?最善のアプローチ/ソリューションは何ですか?

4

1 に答える 1

1

したがって、次の 2 つのことがあります。

  1. 車コントローラーのインデックス ページでは、現在のユーザーに属する車のみを表示する必要があります。
  2. 表示ページを所有者に限定したい。

インデックスについては、次のようなものをお勧めします。

def index
  # find logic
  @cars = Car.find(:all,:conditions=>{:customer_id => current_user.customers.collect(&:id)})
  # whatever else
  # ...
end

そしてショーページ:

def show
  # .....
  # after the find logic
  redirect_to :index unless current_user.customers.collect(&:id).include? @car.customer_id 
  # whatever else
  # ...
end

ほとんどの場合、この方法で問題ありませんが、パフォーマンスを向上させるより良い方法は、costumers テーブルに user_id 列を追加することです。これは非正規化と呼ばれますが、パフォーマンスに関しては許容範囲です。

于 2009-12-19T21:46:30.320 に答える