【问题标题】:Left outer join with conditions on Active Record左外连接与 Active Record 上的条件
【发布时间】:2015-01-02 13:36:09
【问题描述】:

如何执行带条件的左外查询。正如我所读到的,ActiveRecord 不允许制作我想要的东西。我试试这个:

Platform.where(url: urls).includes(:campaign_platforms).where.not('campaign_platforms.campaign_id = ?', campaign.id)

并得到“Mysql2::Error: Unknown column 'campaign_id' in 'where clause'...”

UPD:

 class Platform < ActiveRecord::Base
   has_many :campaign_platforms
   has_many :campaigns, through: :campaign_platforms
   has_many :posts
   has_many :screenshoots
   belongs_to :platform_category
   belongs_to :user
 end


 class CampaignPlatforms < ActiveRecord::Base
    belongs_to :campaign, dependent: :destroy
    belongs_to :platform, dependent: :destroy
 end


 class Campaign < ActiveRecord::Base
    has_many :campaign_platforms
    has_many :platforms, through: :campaign_platforms
 end

【问题讨论】:

  • 确保campaign_id 列存在于您的campaign_platforms 表中
  • 你能给我们看看你的模型吗?
  • 它确实存在,正如我所提到的,这是 AR 不允许进行这样的查询。
  • 试试:Platform.joins(:campaign_platforms).where(url: urls).not(campaign_platforms: {campaign: campaign.id})
  • @User089247, Nope, NoMethodError: undefined method `not' for #<:activerecord_relation:0x007fba00fc69c8> 正如我从这里了解的 stackoverflow.com/questions/24358805/left-join-in-rails-4 它必须是连接中的 SQL 查询

标签: mysql ruby-on-rails activerecord


【解决方案1】:

ActiveRecord 使您能够在joins 方法中指定JOIN 条件。

Platform.joins('JOIN campaign_platforms ON platforms.id = campaign_platforms.platform_id JOIN campaigns ON campaigns.id = campaign_platforms.campaign_id').where('campaign_platforms.campaign_id <> ? AND url IN ?', campaign.id, urls)

这意味着您可以将 JOIN 更改为 LEFT JOINLEFT OUTER JOIN 或任何您想要的。

大多数人倾向于使用疯狂的解决方法来避免编写单个 SQL 片段。不要害怕。 ActiveRecord 并不打算完全取代 SQL。

【讨论】:

    【解决方案2】:

    也许你可以使用eager_load

    Platform.where(url:urls).eager_load(:campaign_platforms).where.not('campaign_platforms.campaign_id = ?', campaign.id)
    

    我试过left_outer_joins,但它抛出了一个未定义的方法错误。

    如果你想展示所有没有活动平台的活动,它就像魅力一样。

    【讨论】:

      【解决方案3】:

      解决方案

      #controller
      @search = Box.distinct.select('boxes.*, people.first_name, people.last_name').includes(:street, :block).order('boxes.created_at DESC')
                        .left_outer_joins(orders: [{user: :people}])
                        .page(params[:page]).ransack(params[:q])
       @boxes = @search.result
      
      #view
      <% @boxes.each do |box| %>
      <tr>
         <td><%= box.number %><%=box.first_name %><%=box.last_name %></td>
      </tr>
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多