6

has_many :texts のゲームモデルがあります。問題は、テキストが属するゲームに応じてテキストの順序を変える必要があることです (はい、見苦しいですが、レガシー データです)。Text.in_game_order_query(game)適切な順序を返すメソッドを作成しました。

私のお気に入りの解決策は、デフォルトのスコープを Text モデルに配置することでしたが、それには、それらがどのゲームの一部であるかを知る必要があります。また、各ゲームのテキスト用に個別のクラスを作成したくありません。多くのゲームがあり、さらに多くのゲームが登場し、新しいゲームはすべて同じ順序を使用します。だから私は別のアイデアを持っていました: has_many でテキストを並べ替えます。テキストがどのゲームの一部であるかがわかっている場合:

has_many :texts, :order => Text.in_game_order_query(self)

ただし、ここでは self がクラスなので、それは機能しません。

@game.texts.in_game_order(@game)毎回電話する以外に解決策はありませんか??

4

6 に答える 6

4

PradeepKumarのアイデアを使用してフォローアップすると、次の解決策が機能することがわかりました

Block属性を持つクラスとコンテナ クラス (Page など) を想定すると、block_type次のようなものになる可能性があります。

class Page
  ...

  has_many :blocks do
    def ordered_by_type
      # self is the array of blocks
      self.sort_by(&:block_type)
    end
  end

  ...
end

それからあなたが電話するとき

page.blocks.ordered_by_type

Procによって定義された、あなたが望むものを手に入れます。明らかに、Proc ははるかに複雑になる可能性があり、SQL 呼び出しでは機能しませんが、結果セットがコンパイルされた後です。

更新:
しばらくしてからこの投稿と私の回答を読み直しました。投稿で基本的に提案した別の方法と同じくらい簡単なことをしていただけないでしょうか。

Game呼び出されるメソッドを追加するとどうなりますかordered_texts

  def ordered_texts
    texts.in_game_order(self)
  end

それで問題は解決しますか?Gameそれとも、このメソッドは他のリレーション メソッドと連鎖可能である必要がありますか?

于 2013-01-03T20:12:08.123 に答える
1

協会の延長は可能ですか?

これを機能させることができるようです:

module Legacy
  def legacy_game_order
    order(proxy_association.owner.custom_texts_order)
  end
end

class Game << ActiveRecord::Base
  includes Legacy
  has_many :texts, :extend => Legacy

  def custom_texts_order
    # your custom query logic goes here
  end
end

そうすれば、ゲーム インスタンスが与えられた場合、self を渡すことなくインスタンスのカスタム クエリにアクセスできるはずです。

g = Game.find(123)
g.texts.legacy_game_order
于 2012-08-24T21:04:49.223 に答える
0

これがあなたがそれをすることができる方法です、

   has_many :texts, :order => lambda { Text.in_game_order_query(self) }

これは私が通常お勧めしない別の方法です(しかし機能します)、

has_many :texts do
  def game_order(game)
    find(:all, :order => Text.in_game_order_query(game))
  end
end

そして、あなたはそれらを呼び出すことができます、

game.texts.game_order(game)
于 2012-08-14T10:12:07.340 に答える
0

in_game_order_query クラスメソッドで注文/クエリがどのように見えるかわかりませんが、これを行うことができると思います

has_many :texts, :finder_sql => proc{Text.in_game_order_query(self)}

これまでにこれを使用したことがないことをお知らせしますが、これが機能するかどうかをお知らせいただければ幸いです.

:finder_sql に関する詳細なドキュメントについては、http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many を参照てください。

于 2012-08-15T02:59:42.283 に答える
-1

ランタイム情報を処理したい場合は、次の方法でこれを行う必要があると思います。

has_many :texts, :order => proc{ {Text.in_game_order_query(self)} }
于 2012-08-14T10:08:45.967 に答える