gpt4 book ai didi

ruby-on-rails - 一个模型的两个关系上的 ActiveRecord 命名范围

转载 作者:太空宇宙 更新时间:2023-11-03 16:54:08 25 4
gpt4 key购买 nike

我正在使用两个不同模型与标记模型的多态关联。太好了,简单。但是,这两个模型中的一个也属于另一个模型。

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,我只得到那些有标签的单元。

有什么想法吗?我在这里遗漏了一些明显的东西吗?

更新

不幸的是,我使用的是 Rails 2.3.x,Ruby 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 => 而不是 :join =>,它将生成一个 LEFT OUTER JOIN。也就是说,您可能不需要预先加载关联,只需对其进行查询,因此您的里程可能会有所不同。

关于ruby-on-rails - 一个模型的两个关系上的 ActiveRecord 命名范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13732720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com