2013-06-09 2 views
0

Я создаю приложение словаря синонимов в Rails 3.2.13, где каждое слово имеет много значений, и каждое значение связано со многими словами.Rails self-referential вложенная ассоциация не работает с областью

Следовательно, для того, чтобы получить все синонимы к искомому термину (eg'house ') Я хотел бы быть в состоянии сделать что-то вроде:

Word.syno.find_by_entry('house') 

Я попытался реализация с областью, как это :

class Meaning < ActiveRecord::Base 
    has_and_belongs_to_many :words 
    has_and_belongs_to_many :synonyms, :class_name => "Word" 
end 

class Word < ActiveRecord::Base 
    attr_accessible :entry 
    has_and_belongs_to_many :meanings• 
    scope :syno, includes(:meanings => :synonyms) 
end 

в настоящее время я могу получить синонимы к «дому», с кодом, как: Word.find_by_entry('house').meanings.first.synonims

Однако, когда я прошу Word.syno.find_by_entry('house'), я получаю слово «дом» его эльф и ни один из его синонимов.

Эти сгенерированные запросы SQL, как сообщают рельсы консоль, для этого последнего выражения:

1.9.3p286 :011 > Word.sino.find_by_entry("house") 
    Word Load (0.5ms) SELECT `words`.* FROM `words` WHERE `words`.`entry` = 'house' LIMIT 1 
    SQL (0.3ms) SELECT `meanings`.*, `t0`.`word_id` AS ar_association_key_name FROM `meanings` INNER JOIN `meanings_words` `t0` ON `meanings`.`id` = `t0`.`meaning_id` WHERE `t0`.`word_id` IN (10112) 
    SQL (12.9ms) SELECT `words`.*, `t0`.`meaning_id` AS ar_association_key_name FROM `words` INNER JOIN `meanings_words` `t0` ON `words`.`id` = `t0`.`word_id` WHERE `t0`.`meaning_id` IN (1174, 3941, 4926, 7360) 
=> #<Word id: 10112, entry: "house", changed_at: nil, updated_at: nil> 

Как я должен написать свою сферу, чтобы избежать этого?

ответ

0

Я был неправ, и Rails ответить:

Word.syno.find_by_entry('house') 

является вложенной хэш со всеми house «s значения и синонимы.

Я протестировал этот код в консоли Rails, и я был введен в заблуждение от вывода консоли, который показал только ответ на первый запрос (т. Е. Слово «дом»). Однако, когда я тестировал приложение Rails, все работало нормально.

Тем не менее, мне все равно нужно выяснить, почему вывод консоли не включал результаты последнего из всех запросов.

0

Я думаю, что вы получили слово «дом», потому что это то, о чем вы просили, слово, которое имеет вход «дом». Я бы взял два поэтапных подхода, вроде как с вашим примером «что работает».

class Word < ActiveRecord::Base 
    has_and_belongs_to_many :meanings 
    has_many :synonyms, :through => :meanings 
end 

Word.where(entry: 'house').first.synonyms 

Это предполагает, что слово существует ... На практике вы бы проверить наличие слова перед вызовом для его синонимов.

+0

Нет. Я пробовал, и я тоже не работаю. Я получаю те же результаты. Интересно, почему последний SQL-запрос построен на основе ассоциации Word-Meaning, а не на ассоциации Meaning-Synonim. – CarlesAndres