From 5c926e9206578566a62c3207727bceb00fc07715 Mon Sep 17 00:00:00 2001 From: Man Vuong Date: Sun, 1 Sep 2013 02:04:47 +0700 Subject: [PATCH] Add :has_many_through option --- lib/rolify.rb | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/rolify.rb b/lib/rolify.rb index 4c1ded20..ba4c1a03 100644 --- a/lib/rolify.rb +++ b/lib/rolify.rb @@ -19,15 +19,24 @@ def rolify(options = {}) self.role_cname = options[:role_cname] self.role_table_name = self.role_cname.tableize.gsub(/\//, "_") - default_join_table = "#{self.to_s.tableize.gsub(/\//, "_")}_#{self.role_table_name}" - options.reverse_merge!({:role_join_table_name => default_join_table}) - self.role_join_table_name = options[:role_join_table_name] - rolify_options = { :class_name => options[:role_cname].camelize } - rolify_options.merge!({ :join_table => self.role_join_table_name }) if Rolify.orm == "active_record" rolify_options.merge!(options.reject{ |k,v| ![ :before_add, :after_add, :before_remove, :after_remove ].include? k.to_sym }) - has_and_belongs_to_many :roles, rolify_options + # Option to support has_many :through + has_many_through_table = options.delete(:has_many_through) + if has_many_through_table + self.role_join_table_name = has_many_through_table + rolify_options[:through] = self.role_join_table_name + + has_many :roles, rolify_options + else + default_join_table = "#{self.to_s.tableize.gsub(/\//, "_")}_#{self.role_table_name}" + options.reverse_merge!({:role_join_table_name => default_join_table}) + self.role_join_table_name = options[:role_join_table_name] + rolify_options.merge!({ :join_table => self.role_join_table_name }) if Rolify.orm == "active_record" + + has_and_belongs_to_many :roles, rolify_options + end self.adapter = Rolify::Adapter::Base.create("role_adapter", self.role_cname, self.name) load_dynamic_methods if Rolify.dynamic_shortcuts