Как я могу указать динамические условия в ассоциациях has_many - PullRequest
0 голосов
/ 12 июля 2011
class Message  
  has_many   :threads,  :class_name=>"Message", :conditions => "`#{Message.table_name}`.conversation_id = #{self.send(:conversation_id)}"  
end  

m = Message.first  
NoMethodError: undefined method `conversation_id' for #<Class:0xc5021dc>  

Я даже пробовал с одинарной кавычкой:

class Message  
  has_many   :threads,  :class_name=>"Message", :conditions => '`#{Message.table_name}`.conversation_id = #{self.send(:conversation_id)}'  
end  

m = Message.first  
m.threads  

Это дало мне Mysql::Error: You have an error in your SQL syntax
Кажется, это не учитывает вещь #{...} при создании условия sql

Я мог бы сделать это с помощью прицелов
область действия: темы, лямбда {| conv_id | где (: speech_id => conv_id)}
и получить к нему доступ Message.where («некоторое условие»). threads ()
но я ищу аккуратную ассоциацию как
m = Message.find (1000) В m.threads должны быть указаны все цепочки сообщений, к которым он относится

1 Ответ

2 голосов
/ 12 июля 2011

Нельзя использовать динамические условия в has_many. Тем не менее, в вашем конкретном случае кажется, что вам нужно primary_key и foreign_key вместо:

class Message  
  has_many :threads, :class_name=>"Message", :primary_key => 'conversation_id', :foreign_key => 'conversation_id'
end

Вас также может заинтересовать один из драгоценных камней, добавляющий древовидную структуру в ActiveRecord .

...