2016-10-04 2 views
0

У меня есть метод области, определенный в модели моего ребенка profile.rb следующегоВызова сферы Ребенка через Родитель

scope :fees_to, -> (fees_to) { where("fees_to <= ?", "#{fees_to}") } 

И в родителе, который tutor.rb есть

has_one :profile, dependent: :destroy 

Теперь в рельсах консоли я могу например, Profile.all.fees_to(10) и его действительный. Но как я могу вызвать метод fees_to через родителя Tutor?

В настоящее время я могу фильтровать через мой profiles в виде индекса. Но то, что я хотел бы сделать, - это фильтровать через индексный индекс tutor, основанный на значениях из дочернего элемента.

Вся помощь и совет были бы очень благодарны! Спасибо

+0

В консоли рельсы, 1, 'Репетитор = Tutor.first' 2,' tutor.profile.fees_to (10) '. –

+0

@ 孙悟空 Это не сработает. 'tutor.profile' - это конкретная модель, которая не будет реагировать на' fee_to'. – meagar

+0

@meagar вы правы, QO может создать метод (не scope) в profile.rb 'def fee_to (n) ...... end'. затем 'tutor.profile.fees_to (10)'. –

ответ

0

Это не имеет смысла с has_one. Вы не можете «иметь один» и по-прежнему применять к нему область. Области работают на много записей, чтобы применить дополнительные условия и сузить набор результатов, а не конкретные записи.

Фактически вы пытаетесь добавить состояние where(fees_to < ?) в конкретную запись , что явно не имеет смысла.

Если вы хотите использовать область действия через ассоциацию, она должна быть has_many.

+0

Предполагаю, что я вношу его в has_many, как я это сделаю. Если скажите в моем «наставнике».rb' это 'has_many: profiles' вместо этого, будет что-то вроде' tutor = Tutor.all', за которым следует 'tutor.profiles.fees_to (10)' work? – angkiki

+0

@angkiki Нет, вы бы использовали 'tutor = Tutor.first; tutor.profiles.fees ... '. Вы не можете вызывать ассоциацию в коллекции моделей только на определенной модели. Для 'tutor.profiles.fees_to (10)' работать, 'tutor' должен быть ** отдельной конкретной записью **, а' profiles' должен быть * коллекцией * записей, то есть 'has_many'. – meagar

+0

Означает ли это, что я не могу выполнить поиск или фильтр для моего ребенка в индексе моего родителя? Или есть метод, что я принимаю совершенно неправильный подход? – angkiki

0

В profile.rb: Вы можете создать функцию, как:

def fees_to n 
    Profile.fees_to(n) # your scope is called here 
end 

Затем в рельсах консоли:

tutor = Tutor.first 
tutor.profile.fees_to(10) 

работает как фильтр. Если fees_to анкеты является>n, вы получите [] (массив пустой)

ОБНОВЛЕНО

bad => @tutor = Tutor.all 
good => @tutor = Tutor.includes(:profile).all # with eager loading, avoid n+1 query. 

может быть, вы хотите сделать петлю так:

@tutor.each do |tutor| 
    tutor.profile.fees_to(10) 
end 
+0

Это будет работать, только если Tutor выбран правильно. Итак, в моем индексе Tutor, если я делаю @tutor = Tutor.all, как мне реализовать этот метод? – angkiki

+0

После '@tutor = Tutor.includes (: profile) .all' тогда' @ tutor' не является одним объектом. это коллекция наставника. метод fee_to call вызывается только одним объектом. Итак, вам нужна такая петля: '@tutor.each do | tutor | tutor.profile.fees_to (10) end' Я обновил свой ответ –

0

Я определил следующее мой tutor.rb

def self.fees_search(n) 
    @profile = Profile.fees_to(n) 
    if @profile.empty? 
     return Tutor.none 
    else 
     @profile.each do |y| 
     y.tutor 
     end 
    end 
    end 

Не уверен, что это неудобно или если есть избыточность, но он отлично работает в консоли рельсов. Я могу сделать Tutor.fees_search(10), и он соответственно отображает все соответствующие преподаватели.

Приветствия

Смежные вопросы