在我的用户模型中:
id | name | user_Zip
1 | abc | 10005
2 | mno | 10005
3 | ijk | 10005
并且,在我的职业模型中:
id | UserID | Designation
1 | 1 | Lead
2 | 2 | Lead
3 | 3 | Software Engineer
UserID
是foreign_key。在我的搜索文本框中,我输入" user_Zip",即10005,然后我希望它为我提供一个名称和user_Zip = 10005
的用户名称。
我正在使用此代码:
def search
if ( !params[:tf_Zip].blank? or params[:tf_Zip] != "" )
@user_zip = User.find(:all,:conditions=>['"user_Zip" = ? ',params[:tf_Zip]])
end
end
这样可以正常工作,但它没有给我指定用户。
当我使用此代码加入时:
def search
if ( !params[:tf_Zip].blank? or params[:tf_Zip] != "" )
@user_zip = Profession.joins(:user).where('users.user_Zip' => params[:tf_Zip])
end
end
它也可以正常工作,但不能给我所需的结果。
这些是模型:
# user's model
class User < ActiveRecord::Base
has_many :professions, dependent: :destroy
end
# profession's model
class Profession < ActiveRecord::Base
belongs_to :user, foreign_key: :UserID
validates :UserID, presence: true
end
正如您在上面所看到的,我设置了foreign_key UserID
,但它给了我"progession"."user_id" = ?
并默认使用了foreign_key user_id
答案 0 :(得分:0)
我会这样做:
<强>架构强>
#users
id | name | profession_id | zip
1 | abc | 1 | 10005
2 | mno | 1 | 10005
3 | ijk | 2 | 10005
#professions
id | designation
1 | Lead
2 | Software Engineer
<强>模型强>
#app/models/user.rb
Class User < ActiveRecord::Base
belongs_to :profession
end
#app/models/profession.rb
Class Profession < ActiveRecord::Base
has_many :users
end
操作强>
def search
zip = params[:tf_Zip]
unless zip && zip.blank?
@users = User.where(zip: zip) #-> returns User records for SQL
end
end
@users.each do |user|
user.profession.designation #-> outputs "Lead" / "Software Engineer" for each user
end
答案 1 :(得分:0)
我想在Rich
给出的答案上添加更多内容<强>模型强>
#app/models/user.rb
class User < ActiveRecord::Base
belongs_to :profession
def self.search keyword
return [] if keyword.blank?
self.includes(:profession).where(zip: keyword.strip)
end
end
#app/models/profession.rb
class Profession < ActiveRecord::Base
has_many :users
end
<强>动作强>
def search
@users = User.search params[:tf_Zip]
end
查看强>
@users.each do |user|
user.profession.designation
end
通过这种方式,它只会触发两个查询。
-------------------或-------------------
如果您严格要加入(1个单一查询),那么您可以按如下方式编写
<强>模型强>
#app/models/user.rb
Class User < ActiveRecord::Base
belongs_to :profession
def self.search keyword
return [] if keyword.blank?
self.join(:profession).where(zip: keyword.strip).select("users.*, professions.name")
end
end
#app/models/profession.rb
Class Profession < ActiveRecord::Base
has_many :users
end
<强>动作强>
def search
@users = User.search params[:tf_Zip]
end
查看强>
@users.each do |user|
user['designation']
end