如何通过关系使Rails has_many与has_many条件一起工作?
我一直在研究一个大量使用模型关联的项目,而且似乎我发现has_many或has_one through功能与条件功能冲突的情况。简而言之,问题在于,通过关联为has_one though关系中的中间表创建表别名。但我不知道如何使该表的别名出现在我已经defined.If那是难走的情况,也许代码会有所帮助:如何通过关系使Rails has_many与has_many条件一起工作?
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,但我认为这个问题可能同样适用于rails 3.我读过through关联应该只用于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,:条件=> ['product_instances_events_join.is_draft = 1'] 相信与否,这实际上解决了webrick中的问题,但我很犹豫在多线程乘客环境中使用这种方法,因为我认为这等于修改了一个可能影响其他线程的全局变量。此外,这是一个黑客。
有没有人有任何建议如何解决这个问题?任何帮助将非常感激。
你可以把条件上: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但打开或关闭,而打开整个关联。但我想这在这里没有意义。
另外,我明白,如果你有几个后续'通过'的关联,你想过滤中介的条件,那么这不是非常干燥。这就是我发现自己的地方,这就是我在这里偶然发现的。
什么,没人知道?谁可以回答这个问题就可以获得免费糖果 – jsarma 2012-08-11 22:01:53