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 和一个状态。

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 回答