'加入'不在铁轨上的红宝石上工作

时间:2014-03-17 08:14:38

标签: ruby-on-rails

在我的用户模型中:

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

2 个答案:

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