在(父)模型中操纵搜索对象(子)

时间:2016-10-05 15:36:33

标签: ruby-on-rails

在我的模型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

我做错了什么?

1 个答案:

答案 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

在这里,sSubject模型的数组,而不是单数Subject,这就是它不起作用的原因。你要么需要更多的东西来缩小它,要么循环它,这可能不是你想要的。