3

我在两个模型之间有一个 has_many 关联,使用日期作为每个模型的外键和主键。

它以一种方式完美地工作,但不是另一种方式。

作品

has_one :quiz_log, :primary_key => :start_at, :foreign_key => :start_at

不工作

has_many :event_logs, :primary_key => :start_at, :foreign_key => :start_at 

原因是(我认为)因为 QuizLog 上的 start_at 是 adate而 EventLog 上的 start_at 是 a datetime。所以它返回 nil 试图匹配一个简单日期的确切日期时间。

如何在第二个语句上强制转换 foreign_key start_at 以首先将其从 datetime 转换为简单的 date 以便它匹配第二个模型?

4

3 回答 3

3

我不确定你是否可以在不使用 finder_SQL 的情况下做到这一点,但这应该可以。

has_many :event_logs, :finder_sql => proc { 
   "SELECT * FROM event_logs WHERE DATE(event_logs.start_at) = '#{start_at}'" 
}
于 2013-07-03T07:27:28.090 回答
1

看了两遍标题,我明白你的要求了。可能类似于以下内容会起作用吗?:

has_many :event_logs, :primary_key => :start_at, :conditions => proc { "start_date = '#{event_logs.start_date.to_date}'" }
于 2013-07-02T22:43:00.720 回答
0

我不确定,但我会使用类似的东西:

def event_logs
  EventLogs.where('event_logs.start_at >= ? AND event_logs.start_at < ?', start_at, start_at + 1.day)
end
于 2013-07-02T22:57:46.020 回答