Rails:连接与class_name关联的查询

时间:2016-03-11 07:11:03

标签: sql ruby-on-rails ruby-on-rails-4 activerecord

class A < ActiveRecord::Base
  has_one :b, class_name: "Something::B"
end

module Something
  class B < ActiveRecord::Base
  end
end

假设上面的类结构具有实际的表名asomething_b,我想创建以下SQL查询。

SELECT  "a".* FROM "a" 
INNER JOIN "something_b" ON
"something_b"."a_id" = "a"."id" 
WHERE "something_b"."some_column" = "some_value" LIMIT 1

我尝试了一些

的内容
A.joins(:b).find_by(b: { some_column: 'some_value' })

但结果查询如下,"b"子句中"something_b"代替WHERE

SELECT  "a".* FROM "a" 
INNER JOIN "something_b" ON
"something_b"."a_id" = "a"."id" 
WHERE "b"."some_column" = "some_value" LIMIT 1

有没有办法在没有明确指定表名的情况下执行此操作?

A.joins(:b).find_by(something_b: { some_column: 'some_value' })

2 个答案:

答案 0 :(得分:0)

如果您的模型名称和表名称与rails约定不一致,最简单的形式为table_name = SomeClass.name.pluralize.downcase,那么您需要在模型中定义实际的表名。

module Something
  class B < ActiveRecord::Base
    self.table_name = 'something_b'
  end
end

上面的更改应该在生成的查询中选择正确的表名。

答案 1 :(得分:0)

您可以尝试以下解决方案之一。

  1. 在模块中,您可以定义以下方法

       <android.support.v7.widget.AppCompatSeekBar
        android:id="@+id/teacher_intro_seekbar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:progress="10"
        android:paddingRight="10dp"
        app:progressTint="#c9c9c9"
        app:secondaryProgressTint="#bebebe"
        app:thumbTint="#a9a9a9" />
    
    1. 在课堂上,您可以将表名设置为

      def self.table_name_prefix
         'something_'
      end