ruby-on-rails – 解构Rails .joins&.where方法
我有两个模型 – 横幅和横幅类型.
他们的模式如下所示: 旗帜 # Table name: banners # # id :integer not null,primary key # name :string(255) # image :string(255) # created_at :datetime not null # updated_at :datetime not null # url :string(255) # banner_type_id :integer BannerType # Table name: banner_types # # id :integer not null,primary key # name :string(255) # created_at :datetime not null # updated_at :datetime not null Banner belongs_to:banner_type和BannerType has_many:banners 我在BannerType中有两条记录: BannerType.all BannerType Load (0.3ms) SELECT "banner_types".* FROM "banner_types" => [#<BannerType id: 1,name: "Featured",created_at: "2012-12-17 04:35:24",updated_at: "2012-12-17 04:35:24">,#<BannerType id: 2,name: "Side",created_at: "2012-12-17 04:35:40",updated_at: "2012-12-17 04:35:40">] 如果我想查询查找类型的所有横幅,我可以这样做: Banner.joins(:banner_type).where("banner_types.name = ?",'Featured') 我知道我也可以通过banner_type_id => 1但这与这个特定的问题密切相关. 如果我们分解了这个声明,那么有一些与我有点混乱的事情. > Banner.join(:banner_type) – 将生成NoMethodError:对于#< Class:0x007fb6882909f0>的undefined方法’join’为什么没有Rails方法叫做join,那就是SQL方法的名字? Banner.joins(:banner_types) 很乐意听到你的想法. 谢谢. 解决方法
#1
当阅读简单的英语说“横幅连接横幅类型”与“横幅连接横幅类型”时,它会更加清晰.我不知道有更多的原因. #2
在.joins(:banner_type)中::banner_type是您加入的关系,而不是表.你有 has_one :banner_type 所以这是Rails加入的.这就是当您将符号传递给.joins时,Rails如何工作,并且是当您传递符号不符合您的模型的任何现有关联时,错误是指关联的原因. 这也是为什么您可以使用嵌套关联的符号来深入使用JOIN的多层次,如in the Rails Guide所述 Category.joins(:posts => [{:comments => :guest},:tags]) 也描述了in the Rails Guide,你也可以传递字符串到. Client.joins('LEFT OUTER JOIN addresses ON addresses.client_id = clients.id') 注意,在上一个例子中,当一个String被传递给join时,使用表名地址,而不是一个关联名;这有助于回答#3. #3
经过一些字符串插值后,传递给where方法(类似于连接)的Strings或多或少地直接传递到最终的SQL查询中(AREL将会有一些操作). name是一个不明确的列(您的横幅和banner_types表都有一个名称列),所以通过它的完整路径[TABLE NAME]引用该表,需要[COLUMN NAME].例如,如果您在banner_types中有一些颜色列(横幅中也不存在),则不需要将其用作“banner_types.color =?”.在你的方法; “color =?”将工作正常. 注意,就像#2一样,您可以将符号传递给JOIN’d表的where方法. Banner.joins(:banner_type).where(banner_type: [name: 'Featured']) #4
你不能这样做,因为它不支持AREL,这真的很简单(IMO,一个方法名称,如find_by_banner_type_name相当混乱). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |