1

私のRails 2.2.2アプリでは、次のように結合された2つのテーブル/モデルがあります:

School
  has_many :licenses, :as => :licensable

License
  belongs_to :licensable, :polymorphic => true
  #important fields for this question:
  #start_date: datetime
  #end_date: datetime

現在のライセンスを持つすべての学校を検索したい場合、それは非常に簡単です:

licensed_schools = School.find(:all, :include => [:licenses], :conditions => ["licenses.start_date < ? and licenses.end_date > ?", Time.now, Time.now])

これにより、結合テーブルに有効なライセンスがあるすべての学校が見つかります。ここまでは順調ですね。

ただし、有効なライセンスを持っていないすべての学校を見つけたい場合は、(これまでのところ)より困難です: たとえば、

unlicensed_schools = = School.find(:all, :include => [:licenses], :conditions => ["licenses.id is null or licenses.start_date > ? or licenses.end_date < ?", Time.now, Time.now]  

次に、a)ライセンスをまったく持っていない(罰金)、またはb)古い(無効な)ライセンスと新しい(有効な)ライセンスを持つ学校を含む、少なくとも1つの無効なライセンスがある学校を取り戻します。

言い換えれば、ライセンスを持っていないか、1 つ以上の無効なライセンスがある (有効なライセンスを持っているかどうかに関係なく) すべての学校を返します。有効なライセンスが 0 のすべての学校を返す必要があります。

これを行う方法がよくわかりません。誰でも助けてくれますか?

4

3 に答える 3

0

これはあまり満足のいくものではありません (SQL だけでそれを行う方法を本当に知りたいのですが) 、有効なライセンスを持っているすべての学校の ID を (memcache で) キャッシュし、学校のid はそのリストにあります。

私が言うように、純粋なSQLソリューション、特にネストされたクエリを含まないソリューションを見たいと思っています。私は COALESCE() でそれを行うことができると感じましたが、それを理解することはできませんでした.

于 2013-06-04T08:39:10.900 に答える