Направляющие - несколько индексируют ключевую ассоциацию

Кажется, существует много способов обработать несколько ассоциация внешнего ключа. Каждым путем я приблизился, это имеет их спины ничьей, и поскольку я плохо знаком с направляющими, я - убежденные другие, столкнулись с подобным сценарием, и я, вероятно, работаю над чем-то решенным давно.

Мой вопрос:

Что было бы эффективным способом обработать ключевую ассоциацию индекса нескольких, все еще сохраняя все другие направляющие sql модификаторы (такие как: включайте и т.д.)?

Мой сценарий:

У меня есть ассоциация таблицы, следующим образом (упрощенная), который используется для соединения людей с другими людьми по ссылкам:

People
+----+-----------+
| id | name      |
+----+-----------+
| 1  | Joe       |
+----+-----------+
| 2  | Sally     |
+----+-----------+
| 3  | Bob       |
+----+-----------+                

Links
+----+-----------+---------+
| id | origin_id | rcvd_id |
+----+-----------+---------+
| 1  | 2         | 1       |
+----+-----------+---------+
| 2  | 1         | 3       |
+----+-----------+---------+                        
| 3  | 3         | 2       |
+----+-----------+---------+                        

От строки 1 из вышеупомянутой таблицы Links каждый видит, что Человек (Sally = 2) связан с другим Человеком (Joe = 1).

Для меня легко найти весь из Ссылки Людей, если мой внешний ключ был "origin_id". Но это только показало бы Людям, порождающим Ссылку. В моем сценарии я должен видеть все ссылки независимо, если бы они были порождены или получены Человеком. Если бы, например, я должен был попросить все ссылки Sally's (Sally = 2), то результат, который я хотел бы, был бы:

Links
+----+-----------+---------+
| id | origin_id | rcvd_id |
+----+-----------+---------+
| 1  | 2         | 1       |
+----+-----------+---------+                        
| 3  | 3         | 2       |
+----+-----------+---------+                        

Следовательно у меня есть 2 индексных ключа, и "origin_id" и "rcvd_id".

Одним путем это могло быть решено, с Методом:

class Person < ActiveRecord::Base
  has_many  :link_origins,  :class_name => "Link", :foreign_key => :origin_id, :dependent => :destroy
  has_many  :link_rcvds,    :class_name => "Link", :foreign_key => :rcvd_id, :dependent => :destroy

def links
  origin_person + rcvd_person
end

Однако это не эффективно. Например, это требует, чтобы весь набор был собран от базы данных и только затем, делает нумеровать страницы работу метода (я использую will_paginate драгоценный камень), который побеждает точку, как нумеруют страницы, должен ускорить процесс путем ограничения количества названных записей. Не ограничивают записи после того, как весь набор будет уже сделан.

Кроме того, вышеупомянутое не позволит мне звонить, например, Joe.links (: сначала) .origin_id.name. Не точно этот код, но значение я не мог назвать детали Человека о origin_id выбранного канала, поскольку метод ссылок не знает, что origin_id связан с таблицей People.

До сих пор самое осуществимое решение, кажется: finder_sql.

class Person < ActiveRecord::Base
  has_many :links, :finder_sql => 'SELECT * FROM links WHERE (links.origin_id = #{id} or links.rcvd_id = #{id})'

Это дает все ссылки, где Person_id соответствует или Ссылкам origin_id или Ссылкам rcvd_id.

Вниз сторона этой опции, то, что использование: finder_sql, исключает все другие sql модификаторы, так как направляющие не знают, как проанализировать и изменить SQL, который Вы обеспечиваете. Например, я не смог бы использовать: включайте опцию с: finder_sql.

Так, прямо сейчас я использую: finder_sql, решение. Но кажется, что могло бы быть далеко получения этой ассоциации, сделанной таким способом, которым мне не нужен a: finder_sql. Например, есть ли способ записать пользовательскую строку sql при сохранении направляющих sql модификаторы, которые предоставляет Активная Запись.

Какие-либо идеи о вышеупомянутом?

5
задан Oscar 6 August 2010 в 07:43
поделиться