Лучшее, что я могу предложить, это:
scope :related_to, lambda { |user, context|
tbl = context == :article ? :articles_categories_article_relationships
: :comments_articles_article_category_relationships
where("#{tbl}.user_id = ?", user.id)
}
Это дает вам @comment.article_categories.related_to(@current_user, :article)
, как вы предложили. Но я согласен с Максом Уильямсом. Это излишне запутывает ваш код без реальной выгоды.
Если вы действительно хотите запутать свой код дальше, вы можете сделать это:
def self.method_missing(method, *args)
if method =~ /^(.*)_related_to$/
related_to(*args, $1)
else
super
end
end
def self.related_to(user, context)
through = reflections[context.to_s.pluralize.to_sym].options[:through]
tbl = reflections[through].options[:class_name].underscore.pluralize.gsub('/', '_')
where("#{tbl}.user_id = ?", user.id)
end
Обратите внимание, что я считаю, что в ваших ассоциациях есть несколько опечаток. Вероятно, должно быть:
has_many :comment_article_category_relationships,
:class_name => 'Comments::Articles::ArticleCategoryRelationship'
has_many :comments,
:through => :comment_article_category_relationships,
:source => :comment
has_many :article_relationships,
:class_name => 'Articles::Categories::ArticleRelationship'
has_many :articles,
:through => :article_relationships,
:source => :article