0

私は、 aが manyを持つことができ、 many を持つことができ、 many を持つことができるuserアプリケーションを持っています。peopleprojectsinvoices

私のinvoiceコントローラーには、次のアクションがあります。

def create
  project = current_user.projects.find(params[:invoice][:project_id])    
  @invoice = project.invoices.build(params[:invoice])
  if @invoice.save
    flash[:success] = "Invoice created."
    redirect_to invoices_path
  else
    render :action => "new"
  end
end

問題は、 がない場合は常にエラーがスローされることですproject_id

私はそれを理解し、代わりにこのようなことを試しました...

@invoice = current_user.people.projects.invoices.build(params[:invoice])

...しかし、undefined method projectsエラーが発生します。

invoice新しい遺言が自動的に正しいものに関連付けられ、user誰もそれを改ざんできないようにしたいだけです。

それを行う方法はありますか?

4

2 に答える 2

1

これがあなたが望むものを達成する方法です。コンソールでこれをテストしたので、動作するはずです。人/人の複数形を台無しにしましたが、要点を理解する必要があります。テスト目的でモデルにダミーの属性を与えました。

class User < ActiveRecord::Base
  attr_accessible :name
  has_many :persons

class Person < ActiveRecord::Base
  attr_accessible :person_name, :user_id
  belongs_to :user
  has_many :projects
  has_many :people_invoices
  has_many :invoices, through: :people_invoices

class Project < ActiveRecord::Base
  attr_accessible :person_id, :project_name, :user_i
  belongs_to :person
  has_many :invoices

class PeopleInvoice < ActiveRecord::Base
  attr_accessible :invoice_id, :person_id
  belongs_to :person
  belongs_to :invoice

class Invoice < ActiveRecord::Base
  attr_accessible :invoice_amount, :person_id
  belongs_to :project
  has_many :people_invoice
  has_many :persons, through: :people_invoices

上記の attr_accessible フィールドで確認できるように、各モデルにいくつかのダミー属性を与えました。

私のコンソールで、私は試しました:

@user = User.new(name: "User")
@person = @user.persons.create(person_name: "Employee")
@project = @person.projects.create(project_name: "foo")
@invoice = @project.invoices.create(invoice_amount: 25)
@person_invoice = @person.people_invoices.create(invoice_id:1)

このようにアソシエーションを使用すると、次を呼び出すことができます。

@user = User.find(4)
<User id: 4, name: "User", created_at: "2012-10-19 20:18:28", updated_at: "2012-10-19 20:18:28"> 
@user.persons
=> [#<Person id: 5, user_id: 4, person_name: "Employee", created_at: "2012-10-19 20:19:00", updated_at: "2012-10-19 20:19:00">]
@person.invoices
[#<Invoice id: 1, project_id: 2, invoice_amount: 25, created_at: "2012-10-19 19:33:10", updated_at: "2012-10-19 19:33:10">]

関連付けがあるため、プロジェクトや個人に対応する請求書を見つけて、特定のユーザーまでさかのぼることもできます。リレーションシップは has_many であるため、配列が返されます (最後の 2 つのコンソール出力の括弧に注意してください)。次に、特定の値を表示またはアクセスするには、ブロック内でそれらを循環する必要があります。

お役に立てれば!

于 2012-10-19T20:39:19.117 に答える
-1

使用する必要がありますthrough

class User < ActiveRecord::Base
    has_many :projects
    has_many :invoices, through: projects
end

class Invoice < ActiveRecord::Base
    has_many :projects
    has_one :user, through: projects
end

class Project < ActiveRecord::Base
    belongs_to :user
    belongs_to :invoice
end
于 2012-10-19T19:24:31.163 に答える