2

У меня есть две модели:Как изменить поведение Rails belongs_to

class Sentence < ActiveRecord::Base 
    attr_accessible :sentence_id, :authority_name #... 
end 

class Rule < ActiveRecord::Base 
    attr_accessible :description, :headline, :note, :sentence_id 
end 

Я хотел бы знать, как создать belongs_to :sentence ассоциацию на Rule, который будет вести себя как этот псевдо-SQL кода:

SELECT * FROM rules 
INNER JOIN sentences ON rules.sentence_id = sentences.sentence_id; 

Edit:

Я хотел бы получить что-то вроде этого

rule = Rule.find 797 
# we all know how SQL query will look like... 
rule.sentence 
# => SELECT * FROM sentences 
    INNER JOIN rules ON rules.sentence_id = sentences.sentence_id 
    WHERE rules.id = 797 
+0

Является ли здесь уловкой, что вы хотите получить все правила, принадлежащие какому-либо предложению (т. Е. Существуют некоторые правила, в которых предложение_предложение равно null)? Если каждое правило принадлежит предложению, почему основные 'has_many: rules' для модели Sentence и' belongs_to: sentence' для модели Rule не достигают того, что вы хотите? –

+0

Добавил больше информации на вопрос. :) –

+0

Мне кажется, что базовая настройка ассоциации выполнит то, что вы ищете. Что это за тот подход, которого нет? –

ответ

5

Первый, sentence_id Первичный ключ sentences стол?

Если это так, вам просто нужно явно указать этот столбец в качестве первичного ключа.

class Sentence < ActiveRecord::Base 
    set_primary_key :sentence_id 
end 

class Rule < ActiveRecord::Base 
    belongs_to :sentence 
end 

Если sentence_id не является первичным ключом, то вам необходимо указать его в качестве «первичного ключа» ассоциации. Я не получил возможность проверить код, но это должно быть так:

class Rule < ActiveRecord::Base 
    belongs_to :sentence, :primary_key => :sentence_id 
end 
+0

Бинго! Прекрасно работает. Благодарю. : D –

+0

Кроме того, 'set_primary_key' устарела. Используйте 'self.primary_key = 'sentence_id'' – dennismonsewicz

0

В теории реляционных баз данных, внешние ключи ВСЕГДА перейти к первичных ключей. Чтобы получить активную запись для генерации SQL, вы хотите установить первичный ключ.

class Sentence < ActiveRecord::Base 
    set_primary_key :sentence_id 

Я думаю, что это то, что вы хотите, но вот альтернатива. Чтобы выполнить пользовательское соединение, используйте метод joins() и поставьте строку, которую вы хотите в своем SQL.