繁体   English   中英

您如何通过关系来使Rails has_many与has_many条件一起工作?

[英]How do you get Rails has_many through relations to work with has_many conditions?

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

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

直通关联将event_intakes表别名为“ product_instances_events_join”。 但是条件event_intakes.is_draft中的表未更改为与其匹配。

我使用的是Rails 2.3.11,但我认为问题可能同样适用于rails3。我读到贯通关联应仅与has_many一起使用,而不能与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而是打开或关闭整个关联。 但是我想这不重要。

另外,我确实了解到,如果您要通过中介条件来过滤多个后续的“直通”关联,那么这并不是很干燥。 那就是我发现自己的地方,这就是我在这里碰巧的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM