Rails Scope返回一个数组而不是ActiveRecord_Relation

时间:2015-11-18 21:41:37

标签: ruby-on-rails ruby

Agency has_many Contacts。在搜索表单中:用户输入联系人的姓名。提交后,该应用程序将返回所有与该输入名称相关联的联系人。

两种模式:

#models/agency.rb
class Agency < ActiveRecord::Base
  has_many :contacts, dependent: :destroy

    scope :by_contact_name, ->(contact_name)
                              {joins(:contacts)
                               .select("CONCAT('first_name', ' ', 'last_name')AS 'full_name')")
                               .where("full_name LIKE ?", contact_name) 
                              }
end

#models/contact.rb
class Contact < ActiveRecord::Base
  belongs_to :agency
end

基本上:contact具有以下属性:first_namelast_name。在搜索表单中,对用户的提示是:输入联系人的姓名。然后在Controller中,我调用by_contact_name的代理范围,传入用户输入的值,加入表,创建full_name的该列,因为它在数据库中不存在,并且然后用LIKE进行查询。

我希望这是有道理的!范围有效,但问题是当我希望它返回ActiveRecord_Relation时它会返回一个数组。

我认为问题在于我在范围内select,但我不知道有任何其他方法可以做到这一点。

我的整体问题是:

如果我致电Agency.all.by_contact_name("Joe").class,我该怎么做才能让它返回Agency::ActiveRecord_Relation而不是Array

2 个答案:

答案 0 :(得分:0)

我会在Rails中构建全名,但在where子句中连接以便能够查询它。

{joins(:contacts)
.where("CONCAT('first_name', ' ', 'last_name') LIKE ?", contact_name)}

答案 1 :(得分:0)

这对我有用:

#models/agency.rb
class Agency < ActiveRecord::Base
  has_many :contacts, dependent: :destroy
  scope :by_contact_name, -> (name){joins(:contacts).merge(Contact.by_name(name))}
end

#models/contact.rb
class Contact < ActiveRecord::Base
  belongs_to :agency
  scope :by_name, -> (full_name){where("CONCAT(first_name,' ',last_name) LIKE ?", "%#{full_name}%")}
end

<强>用法

@agencies = Agency.by_contact_name("joe s")