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_name
和last_name
。在搜索表单中,对用户的提示是:输入联系人的姓名。然后在Controller中,我调用by_contact_name
的代理范围,传入用户输入的值,加入表,创建full_name
的该列,因为它在数据库中不存在,并且然后用LIKE
进行查询。
我希望这是有道理的!范围有效,但问题是当我希望它返回ActiveRecord_Relation时它会返回一个数组。
我认为问题在于我在范围内select
,但我不知道有任何其他方法可以做到这一点。
我的整体问题是:
如果我致电Agency.all.by_contact_name("Joe").class
,我该怎么做才能让它返回Agency::ActiveRecord_Relation
而不是Array
?
答案 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")