我是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表中检索列?
答案 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')