我有3種型號.includes的正確使用和.joins
選項:
class Option < ActiveRecord::Base
attr_accessible :key, :name
belongs_to :item_options
end
ItemOptions
class ItemOption < ActiveRecord::Base
# attr_accessible :title, :body
belongs_to :item
belongs_to :option
end
和項目:
class Item < ActiveRecord::Base
has_many :item_options
has_many :options, :through => :item_options
end
但我需要控制器返回其所有選項中的所有項目JSON格式所以我試圖用.includes,但沒有運氣:
items = Item
.order('id')
.where(manufacturer)
.where('is_active')
render :json => {:data => items.offset(offset), :total => items.count}.to_json(
:include => :options
)
結果不包含的選擇,但我看到控制檯有相應的DB請求。但是如果我使用它僅適用於:包括內to_json:
items = Item
.order('id')
.where(manufacturer)
.where('is_active')
render :json => {:data => items.offset(offset), :total => items.count}.to_json(
:include => :options
)
所以第一個問題是什麼我做錯了,這樣.INCLUDE不起作用?
但我也有工作代碼的問題。當item_options爲已定義項目的已定義選項保留值時,我需要將選項與item_options結合使用,因爲選項僅存儲選項名稱,選項組標識等。所以我試圖延長我的代碼如下:
items = Item
.order('id')
.where(manufacturer)
.where('is_active')
render :json => {:data => items.offset(offset), :total => items.count}.to_json(
:include => {
:options => {
:joins => :item_options
}
}
)
但仍然,我收到的選項不beeing加入item_options。爲什麼?
此外,如果我在optoins中使用連接,我是否需要通過項目定義has_many,如果它們在item_options中沒有附加信息的情況下加載?
========== UPDATE:
現在我剛剛更換的項目模型的options
關係方法:
item = Item
.includes(:item_options)
.find(params[:id])
render :json => item.to_json(:methods => :options)
,並在產品型號:
has_many :item_options
def options
self.item_options.select('item_options.value, options.name, options.is_feature, options.root').joins('left join options on options.id = item_options.option_id')
end
不知道,但是,如果這個解決方案是最優的。
但它爲什麼不DOS只Item.includes工作(:選項)?爲什麼我需要把它放在to_json中? – SET 2013-02-16 18:09:09
調用包含(:options)填充內存中的所有選項,以便在調用items.options.first時執行不查詢。但是這並不指示JSON序列化程序需要包含它們,這就是指令散列的來源。除名稱外,它們並不相互關聯。 – Cluster 2013-02-16 18:20:48
我試圖擴展你的代碼,使選項與item_options結合 - 「data = items.offset(offset).as_json(:include => {:options => {:joins =>:item_options}})」但它確實沒有效果,你能說出原因嗎? – SET 2013-02-16 18:49:45