簡體   English   中英

Rails Scope返回一個數組,而不是ActiveRecord_Relation

[英]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_namelast_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM