我正在使用兩個不同模型的多態關聯標記模型。太棒了,容易。但是,這兩種模式中的一種也屬於另一種模式。ActiveRecord將兩個關係命名爲範圍到一個模型
class Facility < ActiveRecord::Base
has_many :units
has_many :taggings, :as => :taggable
has_many :tags, :through => :taggings
end
class Unit < ActiveRecord::Base
belongs_to :facility
has_many :taggings, :as => :taggable
has_many :tags, :through => :taggings
end
class Tagging < ActiveRecord::Base
belongs_to :taggable, :polymorphic => true
belongs_to :tag
end
class Tag < ActiveRecord::Base
has_many :taggings
end
我想寫一個範圍檢索所有單位一定標籤,包括屬於與標籤的基金的單位。這是行不通的:
named_scope :by_tag_id, lambda {|tag_id|
{
:select => "DISTINCT units.*",
:joins => [:taggings, {:facility => :taggings}],
:conditions => ["taggings.tag_id = ? OR taggings_facilities.tag_id = ?",
tag_id.to_i, tag_id.to_i]
}}
對於那個named_scope,我只能得到那些有標籤的單位。
有什麼想法?我在這裏錯過了很明顯的東西嗎
更新
我,不幸的是,on Rails的2.3.x版本,1.8.7紅寶石。
我現在正在嘗試一些更明確地寫入連接的技術。
更新2
我不能回答我的問題,因爲我沒有信譽。哎呀。我真的應該貢獻更多...
嗯,我想我只是需要捅一下,再推一點。下面是我的工作:
named_scope :by_tag_id, lambda {|tag_id|
{
:select => "DISTINCT units.*",
:joins => [
"INNER JOIN facilities as bti_facilities ON units.facility_id = bti_facilities.id",
"LEFT JOIN taggings AS bti_facilities_taggings
ON bti_facilities_taggings.taggable_id = bti_facilities.id AND bti_facilities_taggings.taggable_type = 'Facility'",
"LEFT JOIN taggings AS bti_units_taggings ON bti_units_taggings.taggable_id = units.id AND bti_units_taggings.taggable_type = 'Unit'",
],
:conditions => ["bti_units_taggings.tag_id = ? OR bti_facilities_taggings.tag_id = ?", tag_id.to_i, tag_id.to_i]
}
}
我使用一些模糊故意表的別名,以儘量避免與其他命名範圍衝突。 (我沒有設施別名開始,我遇到了查詢的SQL錯誤,我試圖鏈接到另一個範圍,引用設施表)。
如果有人有更好的答案或對我的一些反饋方法,我會愛聽到它。
謝謝你,我以爲我用':include =>'方法嘗試了(並失敗了),但顯然我已經破壞了方法的其他組件。 –
This works: 'named_scope:by_tag_id,lambda {| tag_id | :select =>「DISTINCT units。*」, :include => [:taggings,{:facility =>:taggings}], :conditions => [「taggings.tag_id =?OR taggings_facilities.tag_id = ?「,tag_id.to_i,tag_id.to_i] } }' –