当前位置: 首页 > 知识库问答 >
问题:

Rails:活动记录协会

沈博达
2023-03-14

我已经两天没有解决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

共有2个答案

长孙诚
2023-03-14

因为产品有许多用户p.users是一个类似数组的对象。您需要p.users[0]。用户名。

但是你为什么不能让它成为一个标准的一对多的协会呢?

杨超
2023-03-14

如果你有一对多关系,不要使用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- 配置。修改日志记录选项以根据自己的需要调整详细信息级别。 配置数据源。 关于上述数据源配置的注意事项: 您通常的驱动程序类名