2013-02-16 45 views
1

我有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 

不知道,但是,如果這個解決方案是最優的。

回答

1

你在調用to_json而不是在模型上,而哈希對包含或連接一無所知。

嘗試把你的JSON選擇型號

data = items.offset(offset).as_json(include: :options) 
render json: {data: data, total: items.count} 

另外,我覺得你的Option belongs_to :item_options應該是Option has_many :item_options

使用:包括as_json內是加載ActiveModel JSON序列化的指令,告訴它包括數據來自輸出JSON中的關聯。

ActiveModel::Serializers::JSONgithub

的連接,幷包括方法的ActiveRecord的一部分,並用於添加連接條件,並執行急切裝載。

ActiveRecord joins
ActiveRecord includes

+0

但它爲什麼不DOS只Item.includes工作(:選項)?爲什麼我需要把它放在to_json中? – SET 2013-02-16 18:09:09

+0

調用包含(:options)填充內存中的所有選項,以便在調用items.options.first時執行不查詢。但是這並不指示JSON序列化程序需要包含它們,這就是指令散列的來源。除名稱外,它們並不相互關聯。 – Cluster 2013-02-16 18:20:48

+0

我試圖擴展你的代碼,使選項與item_options結合 - 「data = items.offset(offset).as_json(:include => {:options => {:joins =>:item_options}})」但它確實沒有效果,你能說出原因嗎? – SET 2013-02-16 18:49:45