【问题标题】:Rails 3 polymorphic associations: scopes on the belongs_to side that reference the association are not workingRails 3多态关联:引用关联的belongs_to侧的范围不起作用
【发布时间】:2011-09-09 18:21:23
【问题描述】:

我有以下多态关联:

class Invite < ActiveRecord::Base
  belongs_to :inviteable, :polymorphic => true 

class Event < ActiveRecord::Base
  has_many :invites, :as => :inviteable, :dependent => :destroy

class Team < ActiveRecord::Base
  has_many :invites, :as => :inviteable, :dependent => :destroy

我正在尝试在特定于事件和未来事件的邀请上创建范围:

(in Invite.rb)
  scope :to_events, where('inviteable_type = ?', "Event")
  scope :to_future_events, lambda { self.to_events.joins("join events").where('events.starttime > ?', Time.now) }

to_events 范围工作正常; to_future_events 返回正确的邀请子集,但它返回每个邀请的许多副本。知道为什么吗?有没有更清洁/ Rails-ier的方式来完成我想要完成的事情?

【问题讨论】:

  • 如果您正在寻找“Rails Way”,您可能应该将“Invite”更改为“Invitation”以明确模型是名词,而不是动词。我想这会让你的代码读起来更好一点。

标签: ruby-on-rails polymorphic-associations


【解决方案1】:

您必须为连接提供 ON 语句:

scope :to_future_events, lambda { self.to_events.joins("join events on events.id = invites.inviteable_id").where('events.starttime > ?', Time.now) }

否则,它会将每个邀请记录与每个事件记录一起加入。

【讨论】:

  • 这是有道理的,虽然我也想要某种inviteable_type == "Event" 检查,对吧?在某些情况下,inviteable_type == "team",inviteable_id 恰好等于某个 event.id,并且该事件在未来。在那种情况下,我仍然会得到一个欺骗结果,对吧?
  • 好吧,您将它从to_events 范围内链接出来,所以它已经具有where('inviteable_type = ?', "Event") 条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多