Ваша идея разбить это на области хороша.Но вам, возможно, не придется объединять в цепочку столько, сколько вы думаете, потому что вы можете объединить области из других моделей в любую связанную модель.Вот отличная статья о слиянии ARel #, которая делает эту замечательную вещь возможной: http://ben.hoskings.net/2012-07-04-arel-merge-a-hidden-gem
Таким образом, вы можете разбить свое мышление на более мелкие куски.Итак, начните с Post и создайте область действия, которая предоставит вам все связанные продукты, предоставленные пользователю.Затем создайте область видимости, которая связывает эту область с областью, которая получает все сообщения с данным событием.Затем просто объедините эту область с вашей областью пользователя.
Product
scope :for_user, ->(user) { where(user_id: user) } # The passed in `user` can be an instance of user or an id
Post
scope :for_product, ->(product) { where(product_id: product) }
scope :for_product_given_user, ->(product, user) { for_product(product).merge(Product.for_user(user)) }
scope :for_product_given_user_and_event, ->(product, user, event) { for_product_given_user(product, user).where(event_id: event) }
Я не уверен, что нахожусь на правильном пути, учитывая, что я не могу проверить ... но, возможно, это поможет вам начать.Идея состоит в том, чтобы разбить обязанности на управляемые куски и позволить ARel выполнить сумасшедшую работу по слиянию SQL.