我已经两天没有解决AR协会的问题了。我知道有一个简单的解决办法,但我想不出来。
我有两个模型,产品和用户,应该联系在一起。一个产品应该属于一个用户,一个用户应该有很多产品。我没有在控制器中设置用户变量,所以我选择了habtm关联。以下是模型:
User.rb
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
#...
has_and_belongs_to_many :products
Product.rb
class Product < ActiveRecord::Base
has_many :product_images, :dependent => :destroy
accepts_nested_attributes_for :product_images, :allow_destroy => :true
has_and_belongs_to_many :users
products\u控制器。rb型
class ProductsController < ApplicationController
def index
@products = Product.search(params[:search]).order(sort_column + ' ' + sort_direction).paginate(:per_page => 10, :page => params[:page])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @products }
end
end
def new
@user = current_user
@product = Product.new#@user.products.build(params[:product])
@product.product_images.build
respond_to do |format|
format.html # new.html.erb
format.json { render json: @product }
end
end
def create
@user = current_user
@product = @user.products.build(params[:product])#Product.new(params[:product])
@product.product_images.build
@user.products << @product
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render json: @product, status: :created, location: @product }
else
format.html { render action: "new" }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
_形式。html。erb公司
<%= form_for @product, :html => {:multipart => true, :class => 'form-horizontal'} do |f| %>
架构。rb型
....
create_table "products_users", :id => false, :force => true do |t|
t.integer "product_id"
t.integer "user_id"
end
....
所以,即使我知道,用户和产品之间应该有一对多的关联,这对我来说是可行的。在IRB中,我可以这样做:
u = User.first
u.products
与habtm协会,我甚至可以做到这一点visevera:
p = Product.first
p.users
但我无法访问用户属性:
p.users.username:
NoMethodError: User Load (2.0ms) SELECT "users".* FROM "users" INNER JOIN "products_users" ON "users"."id" = "products_users"."user_id" WHERE "products_users"."product_id" = 12
谁能帮我摆脱这个困境?我做错了什么?
谢谢!你的帮助将挽救我的周末!
编辑:这是我对一对多关系的控制器操作:
class ProductsController < ApplicationController
helper_method :sort_column, :sort_direction
def index
@products = Product.search(params[:search]).order(sort_column + ' ' + sort_direction).paginate(:per_page => 10, :page => params[:page])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @products }
end
结束
def show@produc=Product.find(参数[: id])@image=@product.product_imagesrespond_to|格式化|format.html#show.html.erbformat.json{渲染json:@produc}end end
def new
@user = current_user
@product = Product.new#@user.products.build(params[:product])
@product.product_images.build
#3.times { @product.product_images.build }
respond_to do |format|
format.html # new.html.erb
format.json { render json: @product }
end
end
def edit
@product = Product.find(params[:id])
@product.product_images.build
end
def create
@user = current_user
@product = @user.products.build(params[:product])#Product.new(params[:product])
@product.product_images.build
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render json: @product, status: :created, location: @product }
else
format.html { render action: "new" }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
def update
@product = Product.find(params[:id])
respond_to do |format|
if @product.update_attributes(params[:product])
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
def destroy
@product = Product.find(params[:id])
@product.destroy
respond_to do |format|
format.html { redirect_to products_url }
format.json { head :no_content }
end
end
private
def sort_column
Product.column_names.include?(params[:sort]) ? params[:sort] : "created_at"
# params[:sort] || "created_at"
end
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
# params[:direction] || "asc"
end
end
EDIT2:模式。rb型
create_table "products", :force => true do |t|
t.string "title"
t.string "description"
t.string "testimonial"
t.decimal "credits", :precision => 3, :scale => 0
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.decimal "age"
t.string "condition"
t.string "product_image"
t.string "image"
t.integer "user_id"
end
create_table "users", :force => true do |t|
t.string "email", :default => "", :null => false
t.string "encrypted_password", :default => "", :null => false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", :default => 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "username"
t.integer "product_id"
end
因为产品
有许多用户
,p.users
是一个类似数组的对象。您需要p.users[0]。用户名。
但是你为什么不能让它成为一个标准的一对多的协会呢?
如果你有一对多关系,不要使用has_和beliens_to_many。创建和维护另一个表增加了太多的复杂性。我的建议是找出为什么你不能让一对多的关系发挥作用。
你应该能够做到这一点:
class User < ActiveRecord::Base
has_many :products #Plural
end
class Product < ActiveRecord::Base
belongs_to :user #Singular
end
如果不起作用,请复制/粘贴用于一对多关系的控制器代码!
祝你好运
问题内容: 有没有办法一次插入多个记录而不是一次插入? 我有一个非常丑陋的耙子任务,正在做以下事情… 这必须非常低效,并且必须有更好的方法… 问题答案: 该方法也将数组作为参数。 但是,它仍然对每个条目执行一个SQL查询,而不是单个SQL查询。它效率更高,因为它只需要在后台创建一个activerecord对象。 如果要同时从同一客户端插入许多行,请使用带有多个VALUES列表的INSERT语句一次
我有这些疑问: 和 对于LIST和GET方法。一个集合有零个或多个项目。我在Items中定义了与alloy\u to field的关系,在集合中有许多字段,这很好。 然后,当我查询集合并呈现JSON时,我想按属于Item的名为number的整数变量对项目进行排序。 我试过了,但不起作用: 我想按编号对集合中的项目列表进行排序。这就是@collections=Collection。all()返回,我
Active Record 提供了一个面向对象的接口, 用以访问和操作数据库中的数据。Active Record 类与数据库表关联, Active Record 实例对应于该表的一行, Active Record 实例的属性表示该行中特定列的值。 您可以访问 Active Record 属性并调用 Active Record 方法来访问和操作存储在数据库表中的数据, 而不用编写原始 SQL 语句。
问题内容: 我们正在使用Kubernetes 1.1.3及其默认的fluentd-elasticsearch日志记录。 我们还在容器上使用LivenessProbes来确保它们按预期运行。 我们的问题是,我们从LivenessProbe发送到STDOUT的行似乎没有到达Elastic Search。 有没有办法像吊舱中的常规容器一样使流利的船LivenessProbes输出? 问题答案: 探针的输
我在类方法中使用active record import gem来导入从csv文件读取的列表数组,如下代码所示: 根据active record导入文档,我正在尝试将列表的标题和VIN字段设置为冲突目标。如果列表的VIN字段发生冲突,我希望进行更新,而不是创建。 但是现在,每次我运行CSV上传时,它都在从isting.import创建一个新的列表,而不检查它是否冲突。 我哪里出错了?
问题内容: 如何查看我的池库(C3P0)创建和关闭JDBC连接的时间? 注意:我已经对此进行了研究,并且已经找到了解决方案。我将其发布在这里,以便对其他人有用,并且可以参考以防万一将来忘记它。 欢迎其他方法/答案。 问题答案: 库可用于记录JDBC连接。将此库添加到POM- 配置。修改日志记录选项以根据自己的需要调整详细信息级别。 配置数据源。 关于上述数据源配置的注意事项: 您通常的驱动程序类名