Just wondering if rails will allow me to have one model belong to
another model via 2 foreign keys in the same table, not just one?
So like this…
belongs_to :individuals, :foreign_key => “individual_a”
belongs_to :individuals, :foreign_key => “individual_b”
That would be something like:
belongs_to :individual_a, :class_name => “Individual”
belongs_to :individual_b, :class_name => “Individual”
Note that the first argument to
belongs_to is the name of the association.
In the most default case, that is also the name of the table, but that is just
a simplified convention, you could make 10 associations with different
names to the same table. These association names have to be different
of course to be effectively 2 different associations.
You might need a “custom SQL” definition here to find the pairs where
either individual_a_id or individual_b_id matches self.id (self is the
individual here) (read up on the “:finder_sql” option, there is a chance
the JOIN feature is much more performant than “id = a OR id = b”).
Alternatively (slightly less efficient, but still acceptable), you could make
2 queries and join the data in Ruby.
has_many :pairs_a, :class_name => “Pair”, :foreign_key => “individual_a_id”
has_many :pairs_b, :class_name => “Pair”, :foreign_key => “individual_b_id”
pairs_a + pairs_b
None of this code will not protect you from double pairs (that is two or more
“pairs” entries that somehow logically infer the same pair).
my database table “pairs” has the following columns:
Suggest to change column names to “individual_a_id” and “individual_b_id”
to stay closer to the Rails idioms.
I want to be able to call ALL pairs that belong to an individual, who
could be listed as either “individual_a” or “individual_b”
If my pair table had the following rows…
id | individual_a | individual_b
1 | bob | frank
2 | frank | dave
So we see that frank has 2 pairs, but is listed as individual_a in one,
and individual_b in the other.
I want to do something like
Individual.find(franks_id).pairs.all = [PairObject_1, PairObject_2]
… so that it returns every pair that frank is a part of, regardless of
if he is individual_a or individual_b