现在使用jruby 1.7.18(1.9.3p551)将我的Rails应用程序从3升级到4.1。
有一个名为PartyMembership的类,它有两个整数属性:from,:to。
在此课程中,可以按日期过滤PartyMemberships。获取所有条目:from,:to matches。
scope :at_date, lambda { |date| base.where(base.condition_for_date(date)) }
以下方法生成所需的sql查询:
def condition_for_date(date)
["(#{table_name}.from IS NULL OR #{table_name}.from <= ?) AND (#{table_name}.to IS NULL OR #{table_name}.to >= ?)", date, date]
end
虽然日期是年和月的整数组合。 (例如201101)
现在的问题是,当没有:指定时,ActiveRecord不会返回任何条目。当我直接在mysql控制台上执行生成的语句时,使用相同的数据库,返回了条目。
SELECT `party_memberships`.* FROM `party_memberships`
WHERE `party_memberships`.`candidate_id` = 26353238
AND (
(party_memberships.from IS NULL
OR party_memberships.from <= 201002
)
AND (
party_memberships.to IS NULL
OR party_memberships.to >= 201002)
)
ORDER BY `party_memberships`.`from` ASC,
`party_memberships`.`from` DESC
当我尝试在rails控制台上执行SQL时,也没有返回任何条目。
ActiveRecord::Base.connection.execute(query)
什么原因可以阻止ActiveRecord获得正确的结果?
编辑:
序列化存在问题。当日期为nil时,它在db中存储0而不是NULL。在rails中,所有数据库操作都在事务中运行,该事务在每次测试后都会回滚。所以不可能从mysql控制台看到数据库的任何变化。这就是为什么创建的sql语句在mysql控制台上执行时返回结果的原因。