感谢所有对我有帮助的人。我只有最后一个问题,我想我可以取消这个学习项目。
我想创建一个JSON对象,像这样:
[
{name: 'xbox',
upc: '1313413412',
available_on: '12/31/18',
properties: [
{name: 'material',
value: 'plastic'
},
{name: 'color',
value: 'white'
},
]
},
{name: 'nintendo',
upc: '1313413412',
available_on: '12/31/18',
properties: [
{name: 'material',
value: 'plastic'
},
{name: 'color',
value: 'black'
},
]
}
]
我有3个表product,properties,product_properties
我是通过这样做来加入他们的。
@products = Product.joins(:properties, :product_properties)
@products.each do |product|
end
但是我不知道从这里去哪里。对于新问题,我深表歉意。我只是在尝试边做边学。我的关联设置正确。
模式:
ActiveRecord::Schema.define(version: 2018_09_24_163027) do
create_table "product_properties", force: :cascade do |t|
t.string "value"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "product_id"
t.integer "property_id"
t.index ["product_id"], name: "index_product_properties_on_product_id"
t.index ["property_id"], name: "index_product_properties_on_property_id"
end
create_table "products", force: :cascade do |t|
t.string "name"
t.string "upc"
t.datetime "available_on"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "properties", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "product_id"
t.index ["product_id"], name: "index_properties_on_product_id"
end
end
再次感谢您可以提供的任何帮助。
答案 0 :(得分:1)
@products.map do |product|
{
name: product.name,
properties: product.product_properties.map do |product_property|
{
name: product_property.property.name,
value: product_property.value
}
end
}
end.to_json
随意放置您需要的任何属性。您提到需要JSON,但实际上粘贴了Ruby哈希,我在末尾添加了.to_json
。
答案 1 :(得分:1)
首先,您需要定义模型并设置它们之间的关系。使用示例中的表,模型类将为:
class Product < ApplicationRecord
has_many :product_properties
has_many :properties, through: :product_properties
end
class Property < ApplicationRecord
has_many :product_properties
has_many :products, through: :product_properties
end
class ProductProperty < ApplicationRecord
belongs_to :product
belongs_to :property
end
(有关更多信息,请访问: https://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many)
然后,在您的控制器方法中
products = Product.joins(:properties, :product_properties).map do |product|
{
name: product.name,
upc: product.upc,
available_on: product.available_on.strftime("%m/%d/%Y"),
properties: product.product_properties.map do |pr_property|
{
name: pr_property.property.name,
value: pr_property.value
}
end
}
end
render json: products
尽管有一个查询优化的浪费空间,但是,我认为这适合进行项目研究。