Railsの:BがCに属し、Bが最後に与えられたAのために作成されたCリターンA belongs_toのモデルにhas_manyのBでは?

StackOverflow https://stackoverflow.com/questions/2247257

質問

私は三つのモデルA、B、及びC、A has_many Bを有します。 B belongs to C、およびB has a created_on timestamp。 Bを介してCのにhas_manyのA

私は戻りたいは、AはCに属し、Bを持っているすべての A Bは、そのAの最後に作成されたBです。

私は、メソッドループでこれを行うことができます。これはnamed_scopesでのみ行わ?,または他のいくつかのエレガントな/効率的な方法であることはできますか?

A、B及びCは、例えば、ペット(A)のように想像することができる現実世界(TM)の例の要求ごととして、PetsName(B)、及び名前(C)。 PetsNamesは、特定の時間にペットに与えられ、任意の名前は、多くのペットに与えることができます。どれでもペット(:リレーションシップを介して)多くの名前を持つことができます。私が欲しい与えられた名前のためにすべてのその名は、そのペットのための最も最近作成PetNameであるペットの。呼び出しが@name.pets.most_recently_named_asのようなものに見えるかもしれません。

役に立ちましたか?

解決

これを行うにはRailsの道は、ペットの名前付きスコープです。

このような何かます:

class Pets
  has_many :pet_names
  has_many :names, :through => :pet_names

  named_scope :with_current_name, lambda {|name| 
    { :joins => "JOIN (pet_names pna, names) " +
        "ON (pna.pet_id = pets.id AND pna.name_id = names.id) " +
        "LEFT JOIN pet_names pnb " +
        "ON (pnb.pet_id = pets.id AND pna.created_at < pnb.created_at)", 
      :conditions => ["pnb.id IS NULL AND names.id = ? ", name]
    }
  }
end

Pets.with_current_name(@name)
@name.pets.with_current_name(@name)

物事を保つために、あなたは常に名前の範囲を呼び出すC /名前のメソッドを定義することができ中心の命名ます。

あなたは常に行うことができます。

class Name < ActiveRecord::Base
  has_many :pet_names
  has_many :pets, :through => :pet_names

  def currently_named_pets
    Pets.with_current_name(self)
  end
end

@name.currently_named_pets

これは、参加するかなり複雑です。これはおそらく、あなたがこの情報を保存する方法を再考すべき必要がある指標です。なぜそれが名前は別のテーブルにすることがとても重要なのですか?

あなたはこのような何かをやったほうが良いかもしれません

ペットにnameold_name列を追加した後:

class Pet < ActiveRecord::Base
  serialize :old_name, Array
  def after_initialization 
    @old_name ||= []
  end

  def name= new_name
    self.old_name << new_name
    self.name = new_name
  end

  named_scope :with_name, lambda {|name|
     { :conditions => {:name => name}}
  }
end
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top