這裏是我的數據模型:DataMapper的有n個通過和相關查詢
class A
has n, :b
has n, :c, through => :b
def active_c
c.active
end
end
class C
class << self
def active
all(self.end_on => nil) + all(:conditions => [ "cs.end_on > applied_to" ])
end
end
end
的SQL後的樣子:
SELECT `cs`.`id` FROM `cs` INNER JOIN `bs` ON `cs`.`id` = `bs`.`c_id` INNER JOIN `as` ON `bs`.`a_id` = `as`.`id` WHERE (`bs`.`a_id` = 1672 AND `cs`.`end_on` IS NULL)
SELECT `cs`.`id` FROM `cs` INNER JOIN `bs` ON `cs`.`id` = `bs`.`c_id` INNER JOIN `as` ON `bs`.`a_id` = `as`.`id` WHERE (`bs`.`a_id` = 1672 AND (cs > applied_to))
SELECT `id`, `created_at`, `updated_at`, `applied_to`, `end_on` FROM `cs` WHERE (1 = 0 OR 1 = 0) GROUP BY `id`, `created_at`, `updated_at`, `applied_to`, `end_on` ORDER BY `id`
如果我改變active_c這個IMPL:
def active_c
C.all(:bs => {:a_id => self.id}).active
end
調用a.active_c的結果SQL是:
SELECT `c_id` FROM `bs` WHERE `a_id` = 1670
SELECT `c_id` FROM `bs` WHERE `a_id` = 1670
SELECT `id`, `created_at`, `updated_at`, `applied_to`, `end_on` FROM `cs` WHERE ((1 = 0 AND `end_on` IS NULL) OR (1 = 0 AND (cs.end_on > applied_to))) ORDER BY `id`
現在兩個問題:
- 我必須使用cs.end_on在第二個狀態爲爲表也有一欄叫end_on和DM會混淆
- 爲什麼有3個疑問並且其中1 = 0從
感謝
你可以標記與您所使用的語言你的問題? – 2011-04-12 16:53:09
我當然可以。完成。 – yiwen 2011-04-12 17:16:19