ruby-on-rails Ruby on Rails使用外键

gk7wooem  于 2023-03-09  发布在  Ruby
关注(0)|答案(2)|浏览(287)

我觉得这是一个简单的错误,我无法找出,但我没有找到任何在线帮助解释我做错了什么。我有三个表创建在我的Ruby on Rails应用程序:

Facility
 facility_name - string
 address       - string
 city_id       - integer
 state_id      - integer
 
 and foreign keys: cities, states

City
  city_name    - integer
  state_id     - integer

State
  state_short  - string
  state_long   - string

我把模型定义为:

class Facility < ApplicationRecord
  has_one :city
  has_one :state
end

class City < ApplicationRecord
  belongs_to :state
  belongs_to :facility
end

class State < ApplicationRecord
  has_many :cities
  belongs_to :facility
end

我想我可以通过Rails控制台上的以下代码调出设施内的城市和州:

x = Facility.first
x.city_name
x.state_long

但是这两个代码都给予了一个错误。我是否搞错了,通过在facilities表中使用city_idstate_id以及上面的关系,我应该能够从相应的表中获得city_namestate_long

mrzz3bfm

mrzz3bfm1#

class Facility < ApplicationRecord
  has_one :city
  has_one :state
end

这意味着citiesstates表具有facility_id
但是在模式facilties中,city_idstate_id
这意味着你需要这样改变你的联想

class Facility < ApplicationRecord
  belongs_to :city
  belongs_to :state
end

class City < ApplicationRecord
  belongs_to :state
  has_one :facility
end

class State < ApplicationRecord
  has_many :cities
  has_one :facility
end

另一个选项是更改模式(如果保持关联)

facilities
-----------
facility_name
address

cities
-----------
city_name
state_id 
facility_id

states
-----------
state_short
state_long
facility_id

换句话说,您需要在belongs_tohas_one之间进行选择
区别在于放置外键的位置(它位于声明belongs_to关联的类的表中),但是您还应该给予数据的实际含义,has_one关系表示某个东西的一个是您的-也就是说,某个东西指向您
在任何情况下,如果设施示例没有city_namestate_long方法,则会发生错误,因为添加关联不会定义关联模型的方法
你可以这样称呼它

facility = Facility.first
facility.city.city_name
facility.state.state_long

但是可以添加这样的方法

class Facility < ApplicationRecord
  belongs_to :city
  belongs_to :state

  def city_name
    city.city_name
  end

  def state_long
    state.state_long
  end
end

或使用delegate方法

class Facility < ApplicationRecord
  belongs_to :city
  belongs_to :state

  delegate :city_name, to: :city
  delegate :state_long, to: :state
end

之后你可以这样称呼它

facility = Facility.first
facility.city_name
facility.state_long
hivapdat

hivapdat2#

可以从facility模型中的city关系得到city_name,如下所示:

x = Facility.first
x.city.city_name

state_long相同

x.state.state_long

相关问题