【问题标题】:has_many conditions or proc on foreign keyhas_many 条件或 proc 外键
【发布时间】:2013-07-02 22:25:01
【问题描述】:

我在两个模型之间有一个 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 转换为简单的 date 以便匹配第二个模型?

【问题讨论】:

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


    【解决方案1】:

    我不确定不使用 finder_SQL 是否可以做到这一点,但这应该可以。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我在尝试时收到“输出错误:#”。 ;-(
      • 这失败了,因为你在它的声明中引用了event_log。试试has_many :event_logs, :primary_key => :start_at, :conditions => proc { "DATE(start_date) = '#{start_date}'" }
      【解决方案3】:

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

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

      【讨论】:

      • 我不是在寻找一个日期范围,而是一个单一的日期,我也将 has_many through 用于另一个模型,我不确定一种方法是否可以将功能保留在其他模型上型号?
      • 为什么是范围?因为你在你的问题中告诉你有一个日期时间(有几个小时)。不,我不认为 has_many through Works。
      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多