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
這是一個相當複雜的加入。這是一個指標,你應該應該重新考慮你存儲這些信息的方式。爲什麼名稱放在單獨的表格中如此重要?
你可能會更好做這樣的事情:
加入name
和old_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
硬盤使用A,B,C理解。嘗試編輯使用真正的名詞(即食譜,成分等)。我認爲你會是一個更好的迴應。 – Jonathan 2010-02-12 00:27:48
我已經提供了一個真實世界的例子。 – Matt 2010-02-13 17:36:13