gpt4 book ai didi

mysql - 你如何通过关系获得 Rails has_many 来处理 has_many 条件?

转载 作者:行者123 更新时间:2023-11-29 00:42:10 24 4
gpt4 key购买 nike

我一直致力于一个大量使用模型关联的项目,似乎我发现了 has_many 或 has_one through 功能与 :conditions 功能冲突的情况。简而言之,问题是 through 关联为 has_one though 关系中的中间表创建了一个表别名。但是我不知道如何使该表别名出现在我定义的条件中。如果这很难理解,也许代码会有所帮助:

class Event < ActiveRecord::Base
has_one :event_intake, :conditions => ['event_intakes.is_draft = 1']
has_many :product_instances, :through => :event_intake
end

class EventIntake < ActiveRecord::Base
belongs_to :event
has_many :product_instances, :conditions => ['is_deleted = ?', '0']
end

class ProductInstance < ActiveRecord::Base
belongs_to :event_intake
end

这是我得到的 MySQL 查询和错误:

Mysql2::Error: Unknown column 'event_intakes.is_draft' in 'on clause': 

SELECT DISTINCT `events`.id FROM `events`
LEFT OUTER JOIN `event_intakes` product_instances_events_join ON (`events`.`id` = `product_instances_events_join`.`event_id`)
LEFT OUTER JOIN `product_instances` ON (`product_instances`.`event_intake_id` = `product_instances_events_join`.`id`) AND event_intakes.is_draft = 1
WHERE (product_instances.serial_number = '313') ORDER BY events.id DESC LIMIT 0, 50

through 关联将 event_intakes 表别名为“product_instances_events_join”。但是条件 event_intakes.is_draft 中的表不会更改以匹配它。

我正在使用 rails 2.3.11,但我认为这个问题可能同样适用于 rails 3。我读到 through association should only used with has_many, not has_one,但我不认为这是这个问题的原因。

如果我只是将条件更改为“product_instances_events_join.is_draft = 1”,它会解决这个特定案例的问题,但在没有表别名时会中断它。如果我可以在 has_one 条件下使用字符串插值来获取正确的表名,那就太好了。是这样的: has_one :event_intake, :conditions => ["#{EventIntake.table_name}.is_draft = 1"]我不认为上面的代码会起作用,因为 EventIntake 的 table_name 在发生别名时不会改变。

我尝试过的另一件事是在我进行查询之前使用类似这样的东西在别名发生之前即时重新定义 has_many 关联:Event.has_one :event_intake, :conditions => ['product_instances_events_join.is_draft = 1']信不信由你,这实际上解决了 webrick 中的问题,但我对在多线程乘客环境中使用这种方法犹豫不决,因为我认为这无异于修改全局变量,这可能会影响其他线程。此外,这是一个 hack。

有没有人有任何建议如何解决这个问题?非常感谢任何帮助。

最佳答案

您可以将条件放在 :product_instances 上

class Event < ActiveRecord::Base
has_one :event_intake
has_many :product_instances, :through => :event_intake,
:conditions => ['event_intakes.is_draft = 1']
end

在 has_one 上设置条件似乎有点尴尬,因为您实际上不是在过滤 event_intakes,而是打开或关闭整个关联。但我想这不是重点。

此外,我确实理解,如果您有几个后续的“直通”关联,您希望通过中介条件过滤这些关联,那么这不是很干。这就是我发现自己的地方,也是我偶然来到这里的原因。

关于mysql - 你如何通过关系获得 Rails has_many 来处理 has_many 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11834606/

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