ruby-on-rails 如何在关联关系中使用作用域

hjzp0vay  于 2023-01-14  发布在  Ruby
关注(0)|答案(2)|浏览(91)

背景

1.我有User
1.我有Event

  1. User可以参加多个Events
    1.我有一个EventUser "通过"表。
    1.我在User模型上有一个名为:events_attending的关联。
    1.我在Event上有pastfuture示波器
    ∮我想达到的目标∮
    我希望能够使用类似于下面的语法来拆分用户正在参加/已经参加的事件-无论正确的等价物是什么。
current_user.events_attending.past

但是我知道我不能,因为events_attending是一个关联,即使这样,我的理解是它是到EventUser的关联,而不是Event,所以作用域仍然不能应用。
我怎样才能做到这一点,这样我就可以做一些像我在上面的代码行中所展示的事情?

有用的源代码

Event.rb

class Event < ApplicationRecord    
    scope :future, -> { where("time > datetime()") }
    scope :past, -> { where("time < datetime()") }

    has_many :event_user
    has_many :attendees, through: :event_user, source: :user
    belongs_to :author, class_name: "User", foreign_key: "user_id"
end

User.rb

class User < ApplicationRecord
  has_many :events
  has_many :events_attending, class_name: "EventUser"
end

EventUser.rb

class EventUser < ApplicationRecord
    belongs_to :user 
    belongs_to :event
end

为了简洁起见,我删除了像设计特性和验证这样的内容。
很感谢你的时间,谢谢。

b4qexyjb

b4qexyjb1#

您可以尝试以这种方式设置Event.rb类和User.rb类,看看它是否有效吗?

class Event < ApplicationRecord    
    scope :future, -> { where("time > datetime()") }
    scope :past, -> { where("time < datetime()") }

    has_many :event_users # Note that this needs to be plural
    has_many :attendees, through: :event_user, source: :user
    belongs_to :author, class_name: "User", foreign_key: "user_id"
end
class User < ApplicationRecord
  has_many :events_attending, class_name: "EventUser"
  has_many :events, through: :events_attending, source: :event
end

然后可以通过current_user.events.past调用用户过去的事件

vmdwslir

vmdwslir2#

基于limciana的有益回答,我修改了User.rb类中的关联,如下所示:

class User < ApplicationRecord
  has_many :event_user
  has_many :events_attending, through: :event_user, source: :event
  has_many :events  
end

我认为之前的问题是我的user.events_attending表达式会返回EventUser记录,但是如果我简单地将它设置为返回Events,* 到 * EventUser,那么pastfuture作用域似乎可以无缝地工作。
也就是说我现在可以

current_user.events_attending.past

current_user.events_attending.future

而且很有效。

相关问题