从连接表中检索数据

时间:2013-03-18 14:55:45

标签: ruby-on-rails activerecord

我是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 个答案:

答案 0 :(得分:1)

可以使用find_by_sql和literal 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模型的一个属性。

答案 1 :(得分: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

答案 2 :(得分:0)

首先,我认为你犯了一个错误。

如果您有两个关系为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'
  )
)

答案 3 :(得分:0)

鉴于状态实际上是Form的属性,您可能希望将状态添加到Forms表而不是连接表。

然后,当您使用查询检索表单时,它们将已经使用它们检索状态信息,即

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

此外,如果您想查找具有特定状态的给定用户的所有表单,您可以使用以下查询:

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