0

私は RoR を初めて使用し、必要なすべてのデータを取得する結合テーブルにクエリを作成しようとしています。

class User < ActiveRecord::Base
    has_many :forms, :through => :user_forms
end

class Form < ActiveRecord::Base
    has_many :users, :through => :user_forms
end

私のコントローラーでは、次のようにユーザーのすべてのフォームを正常に取得できます。

User.find(params[:u]).forms

これにより、すべての Form オブジェクトが得られます

しかし、結合テーブル (user_forms) に新しい列を追加して、フォームのステータス (閉じる、既に入力済みなど) を伝えたいと思います。

user_forms テーブルからも列を取得できるようにクエリを変更することはできますか?

4

4 に答える 4

1

find_by_sqlリテラル sqlを使用してこれを行うことができます。ただし、Rails クエリ メソッドを適切にチェーンして同じクエリを作成する方法はわかりません。

しかし、これは以前に友人のためにまとめた変更例です。

@user = User.find(params[:u])
@forms = @user.forms.find_by_sql("SELECT forms.*, user_forms.status as status FROM forms INNER JOIN user_forms ON forms.id = user_forms.form_id WHERE (user_forms.user_id = #{@user.id});")

そして、あなたはできるようになります

@forms.first.status

モデルstatusの単なる属性のように振る舞います。Form

于 2013-03-18T15:04:02.480 に答える
1

可能です。statusに列を追加したらuser_forms、次のことを試してください。

>> user = User.first
>> closed_forms = user.forms.where(user_forms: { status: 'closed' })

を呼び出したときに処理されるため、結合を追加する必要がないことに注意してくださいuser.forms

user_forms更新:テーブルからフォームに属性を追加するには、次のことを試してください。

>> closed_forms = user.forms.select('forms.*, user_forms.status as status')
>> closed_forms.first.status # should return the status of the form that is in the user_forms table
于 2013-03-18T15:12:50.347 に答える
0

まず、あなたは間違いを犯したと思います。

リレーションを持つモデルが 2 つhas_manyある場合は、リレーションを設定する必要がありますhas_and_belongs_to_many

ほとんどの場合、2 つのモデルが結合されます。

  • has_many-belongs_to
  • has_one-belongs_to
  • has_and_belongs_to_many-has_and_belongs_to_many

has_and_belongs_to_many解決策の一つです。ただし、それを選択した場合は、という名前の結合テーブルを作成する必要がありますforms_users。を選択するhas_and_belongs_to_manyと、結合テーブルにステータスを設定できないことを意味します。

そのためには、form_id、user_id、および status を含む結合テーブルを追加する必要があります。

class User < ActiveRecord::Base
    has_many :user_forms
    has_many :forms, :through => :user_forms
end

class UserForm < ActiveRecord::Base
    belongs_to :user
    belongs_to :form
end

class Form < ActiveRecord::Base
    has_many :user_forms
    has_many :users, :through => :user_forms
end

次に、取得できます

User.find(params[:u]).user_forms

または

UserForm.find(:all,
  :conditions => ["user_forms.user_id = ? AND user_forms.status = ?",
     params[:u],
     'close'
  )
)
于 2013-03-18T15:02:41.520 に答える
0

ステータスが実際には Form のプロパティであることを考えると、結合テーブルではなく Forms テーブルにステータスを追加することをお勧めします。

次に、クエリを使用してフォームを取得すると、フォームと共に取得されたステータス情報が既に含まれています。

User.find(params[:u]).forms.each{ |form| puts form.status }

さらに、特定のステータスを持つ特定のユーザーのすべてのフォームを見つけたい場合は、次のようなクエリを使用できます。

User.find(params[:u]).forms.where(status: 'closed')

于 2013-03-18T15:09:38.583 に答える