1

我不确定这是否没有得到回答,但我不确定要搜索什么,所以如果我要问的问题已经得到回答,请指出正确的方向。

我有 2 个模型:

stock_symbol 和 weight_symbol

stock_symbol中包含与weight_symbol 模型symbol匹配的内容commodity

我怎样才能让关联起作用,所以当我做 stock_symbol.weight_symbol 时,我会找回 weight_symbol。

我知道如何在 SQL 中做到这一点,但如果它不是标准idthis_id那么我大多迷失了。

编辑:

class StockSymbol < ActiveRecord::Base
  has_many :weight_symbols, primary_key: :symbol

  def commodity
    "LC" # This is just an example to simplify it, there is much more to this.
  end
end

class WeightSymbol < ActiveRecord::Base
  belongs_to :stock_symbol, foreign_key: :commodity
end

来自 stock_symbol 的示例对象:

StockSymbol.last
<#StockSymbol id: 729, symbol: "LCJ13C12500", created_at: "2013-03-15 21:50:49", updated_at: "2013-03-15 21:50:49">

来自 weight_symbol 的示例对象:

WeightSymbol.first
<#WeightSymbol id:1, weight_group_id: 1, symbol: "LC", created_at: "2010-01-05 21:13:28", updated_at: "2010-01-05 21:13:28">

设置并运行后,StockSymbol.last.weight_symbols.to_sql 我得到:

"SELECT `weight_symbols`.* FROM `weight_symbols` WHERE `weight_symbols`.`stock_symbol_id` = 'LCJ13C12500'"

编辑2:

查询它应该做什么(我认为):

SELECT * FROM `weight_symbols` WHERE `weight_symbols`.`symbol` = 'LC';

查询以获取我想要的信息。

SELECT * FROM `weight_symbols` a
JOIN `stock_symbols` b
ON a.symbol = b.commodity
WHERE b.symbol = 'LCJ13C12500';

新的股票代码对象

<#StockSymbol id: 729, symbol: "LCJ13C12500", created_at: "2013-03-15 21:50:49", updated_at: "2013-03-15 21:50:49", commodity: "LC">
4

1 回答 1

4

rails 关联方法带有覆盖关系中使用的默认键的选项。StockSymbol如果它是和之间的一对多关联WeightSymbol,则使用以下内容:

# stock_symbol.rb
has_many :weight_symbols, primary_key: :symbol

# weight_symbol.rb
belongs_to :stock_symbol, foreign_key: :commodity

(不确定我是否以正确的方式获得了关联,但您应该明白这一点。)

关联基础指南中的详细关联参考详细列出了属于每种关联类型的所有选项和方法。


编辑:基于您更新的问题的一些额外内容。

我对您的关联应该如何工作感到有些困惑——WeightSymbol似乎没有commodity属性。当? WeightSymbol_ StockSymbol_ weight_symbol.symbol == stock_symbol.commodity在这种情况下,您需要相应地设置键:

# stock_symbol.rb
has_many :weight_symbols, primary_key: :commodity
# :primary_key is the field on this model whose value associated models will store in their foreign_key

# weight_symbol.rb
belongs_to :stock_symbol, foreign_key: :symbol
# :foreign_key is the column on this model that should match the primary_key field in the associated model

其次,您只能使用数据库列设置 Rails 关联,不能使用方法。如果您绝对必须使用一种方法,您可能会伪造关联,例如使用以下内容:

# stock_symbol.rb
def weight_symbol
  WeightSymbol.find_by_symbol(self.commodity)
end

这样做的缺点是效率极低,并且会涉及大量的重新发明轮子。

如果您可以选择创建commodity一个数据库字段,那可能是最好的解决方案,具体取决于它可能更改的频率。例如,如果它是从模型的当前状态派生的,您可以在before_save模型上设置一个过滤器来执行需要发生的任何处理并将适当的值写入该字段:

# stock_symbol.rb
before_save :set_commodity

def set_commodity
  commodity = "LC" # arrived at through whatever processing you do
  self.commodity = commodity
end
于 2013-04-17T23:39:34.900 回答