如何以多对多关系插入行

时间:2010-05-28 16:11:28

标签: ruby-on-rails ruby many-to-many

我在尝试保存到中间表时遇到问题。我是Rails的新手,我花了几个小时就完成了这个但却无法让它工作,也许我做错了。任何帮助将不胜感激。 =)

该应用程序是一个简单的书店,登录用户选择书籍然后创建订单。

显示以下错误:

NameError in OrderController#create
uninitialized constant Order::Orderlist


这些是我的模特:

class Book < ActiveRecord::Base  
    has_many :orderlists
    has_many :orders, :through => :orderlists
end

class Order < ActiveRecord::Base
    belongs_to :user
    has_many :orderlists
    has_many :books, :through => :orderlists
end

class OrderList < ActiveRecord::Base
    belongs_to :book
    belongs_to :order
end


这是我的订单管理员:

class OrderController < ApplicationController

    def add
        if session[:user]
            book = Book.find(:first, :conditions => ["id = #{params[:id]}"])
            if book
                session[:list].push(book)
            end
            redirect_to :controller => "book"
        else
            redirect_to :controller => "user"
        end
     end

    def create
        if session[:user]
            @order = Order.new
            if @order.save
                session[:list].each do |b|
                    @order.orderlists.create(:book => b) # <-- here is my prob I cant make it work
                end
            end
        end
        redirect_to :controller => "book"
    end
end

Thnx提前!
曼努埃尔

3 个答案:

答案 0 :(得分:2)

我只是有时间看一下这个,我很害怕,但我发现的第一件事就是你的has_many关系被称为:orderlists。我认为需要:order_lists,并带有下划线。

答案 1 :(得分:1)

这与您的问题没有直接关联,但是此查询:

book = Book.find(:first, :conditions => ["id = #{params[:id]}"])

...容易受到sql注入攻击。在这种情况下,params [:id]的内容会在没有正确转义的情况下传递给sql。我建议将此行更改为以下内容:

book = Book.find(:first, :conditions => ["id = ?, params[:id]])

以下解释:http://wiki.rubyonrails.org/howtos/security/sql_injection

答案 2 :(得分:0)

是的,这是其中一个问题。然后我可以在'create'方法中使用这一行:

def create
    if session[:user]
        @order = Order.new
        if @order.save
            session[:list].each do |b|
                OrderList.create(:book => b, :order => @order)
            end
        end
    end
    redirect_to :controller => "book"
end

谢谢Chris