-2

私は配列を持っています

[['Part', 'create'], ['Part', 'update'], ['Part', 'delete'], ['Part', 'release'], ['Plan', 'create'], ['Plan', 'update'], ['Plan', 'delete'], ['Plan', 'release'], ['Inspection', 'create'], ['Inspection', 'update'], ['Inspection', 'delete'], ['Inspection', 'release'], ['User', 'create'],['User', 'update']]

部品、計画、検査作成、更新、削除、リリースの順に並べ替えたい

上記の順序で並べ替えたいのは原因です

Part 
  has_many plans
Plan 
  belongs_to :part
  has_many inspections
Inspection
  belongs_to :plan

cancanを使用して動的な役割と権限を実装しました。ユーザーには、アクション(作成、更新、削除、リリース)のアクセス許可が割り当てられている必要があり、SubjectClass(パーツ、計画、検査、ユーザー)の表示順序はそれらの関係である必要があります。

並べ替えを使用すると、

a.sort
 => [["Inspection", "create"], ["Inspection", "delete"], ["Inspection", "release"], ["Inspection", "update"], ["Part", "create"], ["Part", "delete"], ["Part", "release"], ["Part", "update"], ["Plan", "create"], ["Plan", "delete"], ["Plan", "release"], ["Plan", "update"], ["User", "create"], ["User", "update"]] 

a.sort_by{|x, y| x[0] <=> y[0]}
=> [["Part", "create"], ["Part", "update"], ["Part", "delete"], ["Part", "release"], ["Plan", "create"], ["Plan", "update"], ["Plan", "delete"], ["Plan", "release"], ["Inspection", "create"], ["Inspection", "update"], ["Inspection", "delete"], ["Inspection", "release"], ["User", "create"], ["User", "update"]] 

インデックス方式はなんとか使えますか?また、新しいサブジェクトクラスとアクションが後で追加される可能性があります。そのため、並べ替え順序が変わる場合があります。

4

2 に答える 2

3
a = [['Part', 'create'], ['Part', 'update'], ['Part', 'delete'], ['Part', 'release'], ['Plan', 'create'], ['Plan', 'update'], ['Plan', 'delete'], ['Plan', 'release'], ['Inspection', 'create'], ['Inspection', 'update'], ['Inspection', 'delete'], ['Inspection', 'release'], ['User', 'create'],['User', 'update']]
order = [%w{Part Plan Inspection}, %w{create update delete release}]

指定されていないすべての要素の重みが999であると仮定すると(User例のように)、これにより入力配列が指定された順序で並べ替えられます。

a.sort_by{|e| e.zip(order).map{|i,j| j.index(i) || 999}}
=> [["Part", "create"],
 ["Part", "update"],
 ["Part", "delete"],
 ["Part", "release"],
 ["Plan", "create"],
 ["Plan", "update"],
 ["Plan", "delete"],
 ["Plan", "release"],
 ["Inspection", "create"],
 ["Inspection", "update"],
 ["Inspection", "delete"],
 ["Inspection", "release"],
 ["User", "create"],
 ["User", "update"]]
于 2012-10-10T08:24:40.663 に答える
0

Miadenによる上記の回答から手がかりを得て、インデックスメソッドを使用して動作する大まかな実装を取得しました

a.sort_by{|x, y| ['Part', 'Plan', 'Inspection'].index(x[0]) <=> ['Part', 'Plan', 'Inspection'].index(y[0]) and ['create', 'update', 'delete', 'release'].index(x[1]) <=> ['create', 'update', 'delete', 'release'].index(y[1])}

=> [["Part", "create"], ["Part", "update"], ["Part", "delete"], ["Part", "release"], ["Plan", "create"], ["Plan", "update"], ["Plan", "delete"], ["Plan", "release"], ["Inspection", "create"], ["Inspection", "update"], ["Inspection", "delete"], ["Inspection", "release"], ["User", "create"], ["User", "update"]]

さらに乾燥させることができます。

于 2012-10-10T08:37:14.827 に答える