has_many条件或proc对外键

时间:2013-07-02 22:25:01

标签: ruby-on-rails ruby-on-rails-3 associations has-many has-one

我在两个模型之间有一个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是date而EventLog上的start_at是datetime。所以它返回nil,试图在一个简单的日期匹配确切的日期时间。

如何在第二个语句上转换foreign_key start_at,将其从datetime首先转换为简单日期,以便与第二个模型匹配?

3 个答案:

答案 0 :(得分:3)

我不确定你是否可以在不使用finder_SQL的情况下完成它,但这应该可行。

has_many :event_logs, :finder_sql => proc { 
   "SELECT * FROM event_logs WHERE DATE(event_logs.start_at) = '#{start_at}'" 
}

答案 1 :(得分:1)

两次阅读标题后,我明白你的要求。可能会像以下那样起作用吗?:

has_many :event_logs, :primary_key => :start_at, :conditions => proc { "start_date = '#{event_logs.start_date.to_date}'" }

答案 2 :(得分:0)

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

def event_logs
  EventLogs.where('event_logs.start_at >= ? AND event_logs.start_at < ?', start_at, start_at + 1.day)
end