【问题标题】:Queries Ruby on Rails?查询 Ruby on Rails?
【发布时间】:2025-06-13 14:00:01
【问题描述】:

如何在 Rails 中进行选择?

SELECT Women.phone, Users.name FROM women, users  WHERE (users.cellid = women.cell_id);

模型/用户.rb

class User < ActiveRecord::Base
    attr_accessible :cellid, :name
    belongs_to :woman
end

model/woman.rb

class Woman < ActiveRecord::Base
    attr_accessible :cell_id, :phone
    has_many :users
end

控制器/index.rb

def index
  @variables = User.all
  @phones = Woman.all
end

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3.2


    【解决方案1】:

    您的 select 语句暗示 UserWoman 由字段 cellid 和 cell_id 链接,因此您必须在 belongs_tohas_many 指令中指定它们:

    class User < ActiveRecord::Base
      attr_accessible :cellid, :name
      belongs_to :woman, foreign_key: :cellid, primary_key: :cell_id
    end
    
    class Woman < ActiveRecord::Base
      attr_accessible :cell_id, :phone
      has_many :users, foreign_key: :cellid, primary_kay: :cell_id
    end
    

    虽然这是可能的,但如果可能,最好使用 Rails 约定并使用 :id 作为主键和 woman_id 作为外键。

    然后在您的控制器中,您可以执行以下操作:

    @users= User.all
    

    在你看来:

    <% @users.each do |user| %>
      <%= user.name %> has woman with phone <%= user.woman.phone %>
    <% end %>
    

    【讨论】:

      【解决方案2】:

      有几种方法可以做到这一点(我会选择第二种):

      # First option
      User.find_by_sql('select Women.phone, Users.name from Women, Users where Users.cellid = Women.cell_id')
      
      # Second option
      User.joins(:women).where('Users.cellid = Women.cell_id').select(['Women.phone', 'Users.name'])
      

      在这两种情况下,您都将获得 Users 对象数组,其中包含 Women.phoneUsers.name 属性。

      【讨论】:

      • 你的第二个选项意味着 userswomen 通过 id 以正常的方式加入。我在 Oleg 的示例 SQL 中看不到这一点。
      • @MartinM,你是对的,他们通过id 加入了正常的rails 方式;有什么问题吗?我发布了该选项,因为我更喜欢该方法而不是像第一个选项那样编写查询。
      • 你的回答是对的,我只是想为其他人指出,示例中的 sql 片段没有反映正常的 rails 方式。