60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
# File 'lib/motion-loco/associatable.rb', line 60
def has_many(model, options={})
attr_accessor model
attr_accessor "#{model.to_s.singularize}_ids"
define_method "#{model}" do |&block|
has_many_class = options[:class_name] ? options[:class_name].to_s.classify.constantize : model.to_s.singularize.classify.constantize
record_array = instance_variable_get("@#{model}")
if record_array.is_loaded
block.call(record_array) if block.is_a? Proc
record_array
else
has_many_ids = instance_variable_get("@#{model.to_s.singularize}_ids")
if has_many_ids
array = has_many_class.find(has_many_ids) do |records|
record_array.load(records)
instance_variable_set("@#{model}", record_array)
block.call(record_array) if block.is_a? Proc
end
record_array.load(array)
else
query = {}
foreign_key = options[:foreign_key] ? options[:foreign_key] : "#{self.class.to_s.underscore.singularize}_id"
query[foreign_key] = self.id
array = has_many_class.find(query) do |records|
record_array.load(records)
instance_variable_set("@#{model}", record_array)
block.call(record_array) if block.is_a? Proc
end
record_array.load(array)
end
instance_variable_set("@#{model}", record_array)
record_array
end
end
define_method "#{model}=" do |records|
has_many_class = options[:class_name] ? options[:class_name].to_s.classify.constantize : model.to_s.singularize.classify.constantize
if (records.is_a?(RecordArray) || records.is_a?(Array)) && (records.length == 0 || (records.length > 0 && records.first.class == has_many_class))
unless records.is_a?(RecordArray)
record_array = RecordArray.new(item_class: has_many_class, belongs_to: self)
record_array.addObjectsFromArray(records)
records = record_array
end
else
raise TypeError, "Expecting a Loco::RecordArray of #{has_many_class} objects as defined by #has_many :#{model}"
end
instance_variable_set("@#{model}", records)
instance_variable_set("@#{model.to_s.singularize}_ids", records.map(&:id))
records
end
alias_method model.to_s.camelize(:lower), model
alias_method "#{model.to_s.camelize(:lower)}=", "#{model}="
relationships = get_class_relationships
relationships << { has_many: model, class_name: options[:class_name] }
end
|