[英]Rails Scope is returning an array instead of an ActiveRecord_Relation
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
Agency范圍,傳遞用戶輸入的值, by_contact_name
表,創建full_name
列,因為它在數據庫中不存在,然后使用LIKE
進行查詢。
我希望這是有道理的! 范圍有效,但是問題是當我希望它返回ActiveRecord_Relation時它返回一個數組。
我認為問題是我可以在范圍內進行select
,但我不知道其他選擇方法。
我的總體問題是這樣的:
如果我調用Agency.all.by_contact_name("Joe").class
,如何使它返回Agency::ActiveRecord_Relation
而不是: Array
?
我會在Rails中建立全名,但要在where子句中串聯才能對其進行查詢。
{joins(:contacts)
.where("CONCAT('first_name', ' ', 'last_name') LIKE ?", contact_name)}
這對我有用:
#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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.