0

2つの関連付けを通じてオブジェクトを構築することは可能has_manyですか?例えば:

# posts_controller.rb
def create
  @post = current_account.posts.build(params[:post])
  @post.author = current_user # I want to compact this line into the previous one
end

私はいくつかの調査を行い、これを見つけました:

@article = current_account.posts.build(params[:post], user_id: current_user.id)

しかし、それはうまくいきませんでした。コンソールではuser_id: nil、新しいオブジェクトを作成するたびに取得し続けました。

私が実装できなかった別の潜在的な解決策:

@post = current_account.post_with_user(current_user).build(params[:post])

しかし、私が書いたすべての実装post_with_userは失敗しました。

私の協会は次のとおりです。

class Discussion < ActiveRecord::Base
  belongs_to :account
  belongs_to :author, class_name: 'User', foreign_key: 'user_id', inverse_of: :discussions
end

class User < ActiveRecord::Base
  belongs_to :account
  has_many :discussions, inverse_of: :author
end

class Account < ActiveRecord::Base
  has_many :users, inverse_of: :account
  has_many :discussions
end
4

2 に答える 2

1

params変数は単なるハッシュであるため、これらの行に沿った何かが機能して、1 つのライナーが得られるはずです。

@post = current_account.posts.build params[:post].merge({ :user_id => current_user.id })
于 2012-10-17T20:52:46.813 に答える
1

あなたのコードがあなたがやろうとしていることを示していることは、あなたができるはずです。次のようになります。

@article = current_account.posts.build(params[:post])

現在のアカウントの投稿のリストから構築しているため、現在のアカウントの ID を渡す必要はありません。(current_user が current_account と同じかどうかはわかりません。これを明確にしたい場合があります)。

投稿の作成を 1 行にまとめるには、次の 2 つの方法のいずれかを実行できます。

  1. ユーザー/作成者と投稿の関係を双方向の関係に変えます。ドキュメントhttp://guides.rubyonrails.org/association_basics.htmlをチェックしてください。注文は顧客に属し、顧客は多くの注文を持っています。関係の名前をカスタマイズして、投稿にユーザーの代わりに「作成者」が含まれるようにするには、「作成者」と呼びますが、class_name パラメーターを使用すると、値が :user になると想定されます。

  2. Post クラスに after-create フックを追加し、作成者の値を現在のユーザーと同じに設定します。ユーザー サブシステムについて何も知らずに、これについてこれ以上詳しく説明することはできません。

于 2012-10-17T16:49:42.690 に答える