簡體   English   中英

如何從關聯的模型中提取信息(Rails)

[英]How to pull information from associated model (Rails)

我正在使用Ransack gem運行搜索。

控制器代碼(用於ItemsController)

@q = Item.search(params[:q])
@search_results = @q.result

運行搜索后, @search_results包含多個Items (項目1,項目2,項目3等)。 每個項目都是哈希值:

Item = { "id" => "12", "name" => "shovel", "user_id" => "2", "type" => "A" }

在這種情況下,對於每個Item哈希,我想添加一個附加的鍵-值對,該對將user_id轉換為與User模型的該實例相關聯的名稱(即, User has_many :ItemsItem belongs_to :Users

我在同一控制器代碼部分中嘗試過

@search_results.each do |item|
    item[:user_name] = User.find_by_id(item.user_id).name
end

但是我收到一個我無法寫到項目的錯誤。 我懷疑Ransack與此有關,因為如果我只打印@search_results ,而不是獲取實際的Item數據, @search_results得到#<ActiveRecord::Relation::ActiveRecord_Relation_Item:0x000001025e6c78>

幫助極大的贊賞!

順便說一句,如果有更簡單的方法,我想用user_name添加另一個鍵/值對的原因是因為最終輸出是JSON,而該JSON已被代碼庫的另一部分拾取,我們不希望運行兩個單獨的數據庫查詢。

首先,您將收到一個紅寶石對象,這意味着您可以在模型中創建一組屬性。 為什么不嘗試在item模型中使用吸氣劑為您設置:

#app/models/item.rb
Class Item < ActiveRecord::Base
    belongs_to :user #-> needs to be singular
    attr_accessor :user_name

    def user_name
       self.user.name
    end
end

這意味着不必從控制器中添加user_name屬性,而是每個Item對象將自動具有user_name屬性

對此的重構也將是在Item模型中使用delegate方法

Class Item < ActiveRecord::Base
    belongs_to :user
    delegate :name, to: :user, prefix: true #-> allows you to call @item.user_name
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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