在我的模型subject.rb
中,我有以下定义的
has_many :tutors, through: :profiles
def self.search(param)
where("name like ?", "%#{param}%")
end
因此Subject.search("English")
之类的东西在rails控制台中运行得非常好。
我想知道的是,如果我subject = Subject.first
,我可以做subject.id
之类的内容,并将主题ID返回给我。
当我做subject = Subject.search("English")
时,我无法执行subject.id
因为我试图使用以下代码将搜索功能链接到我的tutor.rb
模型。
def self.subject_search(s)
@tutor = Tutor.all
@tutor.each do |x|
y = x.subjects.search(s)
unless y.empty?
return x
end
end
end
哪个有效但只返回一个导师而不是所有有这个主题的导师。
我也尝试了这个
def self.subject_search(s)
@subject = Subject.search(s)
if @subject
@subject.tutors
end
end
但是当我意识到@ subject.tutors不起作用时,如上所述,如果我subject = Subject.search("English")
我无法用任何方法操纵subject
。
我做错了什么?
答案 0 :(得分:0)
使用#where
返回符合条件的对象数组。
Subject.search('Math') => ['Math1', 'Math2', 'Math3'] # Objects of course
在您的情况下,您应该执行Subject.find_by_name('English')
,它返回满足您查询的第一个对象。然后,假设您已定义方法,则可以在#tutors
模型上调用Subject
。
如果你必须使用like
运算符,无论什么(我不推荐),这里会发生什么。
s = Subject.search('En') # => ['English', 'Environmental Science', ..]
s.tutors # => Undefined method tutors for Array class
在这里,s
是Subject
模型的数组,而不是单数Subject
,这就是它不起作用的原因。你要么需要更多的东西来缩小它,要么循环它,这可能不是你想要的。