4

祖先の宝石を使用して、ツリー内のいくつかのグループを構築しています。同時に、acts_as_list を使用して、ソートされたリスト内の同じツリー レベルにグループを保持しています。次のモデルがあるとします。

class Group < ActiveRecord::Base
  acts_as_tree
  acts_as_list :scope => "ancestry"

  named_scope :parentable, :conditions => "NOT type = 'PriceGroup'"
  named_scope :without, lambda { |ids| { :conditions => ['id NOT IN (?)', ids] }}

  default_scope :order => "groups.position ASC, groups.name ASC"
end

これはほぼ意図したとおりに機能しました。たとえば@group.path、管理インターフェイスの上部にパンくずリスト ナビゲーションを生成するために使用しています。生成された SQL は問題ありません。ブレッドクラムはツリーの深さでソートされています。少なくとも、これは開発環境に当てはまります。

生成された SQL をトレースすると、祖先pathが結果の順序を生成しているのではなく、代わりに私default_scopeが引き継いでいることがわかりました。

そこで、上書きしてデフォルトのスコープを無視するようにモデルを修正しましたpath

# remove default scope to not change path sorting
def path
  self.class.send :with_exclusive_scope do
    super
  end
end

しかし、これにより開発中の位置スコープが削除されdefault_scopeましたが、本番環境ではまだ完全に無視されています。本番環境で SQL をトレースすると、祖先の深さの順序はわかりませんが、代わりに my からの位置の順序が表示されますdefault_scope

更新:メソッドに「パッチを当てる」という私の最初のアイデアpathはややばかげていたので(ノックノック:継承されておらず、動的に定義されています)、次のことを試してみましたが、まだ役に立ちませんでした:

# remove default scope to not change path sorting
def path_with_exclusive_scope
  self.class.send :with_exclusive_scope do
    path_without_exclusive_scope
  end
end
alias_method_chain :path, :exclusive_scope

開発で呼び出すpathと、生成される SQL は次のようになります。

SELECT *
 FROM "groups"
 WHERE ("groups"."id" IN (5,64))
 ORDER BY (case when ancestry is null then 0 else 1 end), ancestry

それと比較して、本番環境で生成された SQL は次のとおりです。

SELECT *
 FROM `groups`
 WHERE (`groups`.`id` IN (8,49))
 ORDER BY groups.position ASC, groups.name ASC

開発では SQLite を使用し、本番では MySQL を使用しますが、それがここでの決定的な違いだとは思いません。

4

2 に答える 2

1

acts_as_listdefault_scope の処理にいくつかのバグがあります。使用を避けるか、GitHub で修正済みバージョンを探す必要があります。このバージョンを試してください(関連するコミットへのリンクは、以前にリンクしたプル リクエストにあります)。

于 2011-05-13T06:26:58.970 に答える
0

スコープメソッドを使用して同様の問題が発生しました。これは祖先のwikiで見つかりました。

  has_ancestry :cache_depth =>true
  acts_as_list :scope => 'ancestry = \'#{ancestry}\''
  named_scope :ordered, :order => "ancestry_depth,position DESC"

https://github.com/stefankroes/ancestry/wiki/arrange_as_array

于 2011-08-25T06:34:09.350 に答える