通过关联

时间:2018-03-14 22:16:54

标签: ruby-on-rails

我有一个名为Events的模型。该模型基本上是其他3个模型的连接表:

Events.column_names
=> ["id", "performer_id", "location_id", "date"]

在我的应用程序中,我还使用了act_as_follower gem,这有助于用户对不同模型的追随。为此,它会创建一个包含以下列的Follow表:

Follow.column_names
=> ["id", "followable_id", "followable_type", "follower_id", "follower_type", "blocked", "created_at", "updated_at"]

在我的Events控制器中,我想要获取所有事件的列表,performer_id是表演者,然后是current_user。我该怎么做?

我没有运气就尝试了以下内容:

  • act_as_follower有一些有用的方法,如
    book.followed_by?(user)返回true或false,但我没有 能够使它在查询中工作。
  • 我尝试加入表演者表,但我也无法使其发挥作用。

任何帮助表示赞赏!

型号:

class Event < ActiveRecord::Base        
  belongs_to :performer
  belongs_to :location
  acts_as_followable
end

class Performer < ActiveRecord::Base
  has_many :event
  has_many :location, through: :event
  acts_as_followable
end

1 个答案:

答案 0 :(得分:1)

也许是这样的:

Event.where(performer: Performer.followed_by(current_user))

我没有使用acts_as_follower宝石,所以我在猜测。

如果acts_as_follower不支持.followed_by类方法,那么可能会自己动手:

class Performer < ActiveRecord::Base 

  class << self 

    def followed_by(thing)
      where(id: Follow.where(followable_type: 'Performer', follower: thing).pluck(:followable_id))
    end 

  end

end
顺便说一句,我认为Performer看起来更像是:

class Performer < ActiveRecord::Base
  has_many :events
  has_many :locations, through: :events
  acts_as_followable
end

请注意:events:locations的复数形式。